您的位置:首页 > 其它

可扩展的TextView,ExpandableTextView与Scroller类的使用

2014-03-17 19:42 363 查看
转载时请注明出处,尊重他人的劳动成果,谢谢。

废话不多说,先上图演示下成果(图有些丑,别见怪):



最近一直在研究Scroller类的使用方法,看了很多遍别人的例子总是感觉不得要领,最后还是自己实践一下,这个控件的灵感来源于stackoverflow上一个人的提问,就是这种可扩展的TextView,当然,人家那个很好看,那时候感觉很神奇,自从知道Scroller这个类之后就拿它来练练手吧,大伙可以随意更改它的效果,配对了很好看的。

附上代码:

package com.sahadev.sildingfinishlayout;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Scroller;
import android.widget.TextView;

public class ExpandableTextView extends RelativeLayout {
private TextView mTextView;
private Button mButton;
private int mTextViewId = 567576458;// 这里注意不要随便填一个简单的数字,可能会和R中的ID冲突造成无效
private Scroller mScroller;
private int mHeight, mWidthMeasureSpec, mButtonHeight, paddingSize = 1;
private boolean isExpanded, WSettedFlag, HSettedFlag, onceFlag;
private int times = 2;// 缩小的倍数,默认2倍

public ExpandableTextView(Context context) {
this(context, null);
}

public ExpandableTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public ExpandableTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mTextView = new TextView(context);
mTextView.setId(mTextViewId);

mButton = new Button(context);
mButton.setText("扩    展");
mScroller = new Scroller(context);

LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

lp.addRule(RelativeLayout.BELOW, mTextViewId);
lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);

mButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if (!isExpanded) {
// 展开来
mScroller.startScroll(0, mHeight / times, 0, mHeight / times);
postInvalidate();
isExpanded = true;
} else {
// 收回去
mScroller.startScroll(0, mHeight, 0, -mHeight / times);
postInvalidate();
isExpanded = false;
}
}
});

addView(mTextView);
addView(mButton, lp);

}

@Override
public void computeScroll() {
super.computeScroll();
if (mScroller.computeScrollOffset()) {

mTextView.setHeight(mScroller.getCurrY());
postInvalidate();
return;
}
}

public void setTimes(int times) {
if (times == 0) {
throw new ArithmeticException("倍数不能为0");
}
this.times = times;
}

public void setTextViewPadding(int pixels) {
mTextView.setPadding(pixels, pixels, pixels, 0);
paddingSize = pixels;
}

public void setButtonTips(CharSequence text) {
mButton.setText(text);
}

public void setText(CharSequence text) {
mTextView.setText(text);
}

public void setTextColor(int color) {
mTextView.setTextColor(color);
}

public void setTextSize(float size) {
mTextView.setTextSize(size);
}

public void setBackgroundColor(int color) {
mTextView.setBackgroundColor(color);
}

public void setWidth(int width) {
mWidthMeasureSpec = width;
mTextView.setWidth(width - paddingSize * 2);
WSettedFlag = true;
}

public void setHeight(int height) {
mHeight = (height - mButtonHeight) * 2;
HSettedFlag = true;
}

/* onMeasure方法在重绘的时候会一直被调用 */
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

/* 此步骤只用执行一次,获取到textView的宽度以及Button的高度以及一些初始化的值 */
if (!WSettedFlag) {
WSettedFlag = true;
mWidthMeasureSpec = mTextView.getMeasuredWidth();
}

if (!HSettedFlag) {
HSettedFlag = true;
mHeight = mTextView.getMeasuredHeight();
OtherTools.showLog("mHeight----" + mHeight);
}

if (!onceFlag) {
onceFlag = true;
mButtonHeight = mButton.getMeasuredHeight();
OtherTools.showLog("mButtonHeight----" + mButtonHeight);
// mTextView.setHeight(mHeight / times + mButtonHeight >
// heightMeasureSpec ? heightMeasureSpec - mButtonHeight : mHeight /
// times);
mTextView.setHeight(mHeight / times);
}
// int tempHeight = mHeight / 2 + mButtonHeight;
// tempHeight = tempHeight > heightMeasureSpec ? heightMeasureSpec :
// tempHeight;
setMeasuredDimension(mWidthMeasureSpec, mButtonHeight + mTextView.getMeasuredHeight());
}
}

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/slide"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<com.sahadev.sildingfinishlayout.ExpandableTextView
android:id="@+id/hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#a6c" />

</RelativeLayout>

package com.sahadev.sildingfinishlayout;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.Window;

public class MainActivity extends Activity {
private ExpandableTextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);

textView = (ExpandableTextView) findViewById(R.id.hello);

textView.setText("近日,多家媒体报道,山西最大的民营企业联盛集团董事长邢利斌被警方带据分析,邢利斌这次被警方带走,很可能和联盛集团债台高筑有关。不过短短几年,山西煤老板为何就和金融机构从蜜月期走到了剑拔弩张的田地?");
textView.setTextSize(30);
textView.setTextColor(Color.WHITE);
textView.setTextViewPadding(15);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}


由于还不太会往GitHub上传东西,大家就将就着把代码拷贝运行吧,有什么疑问请在下面留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: