今天面试遇到的一个问题,Android TextView点击实现展开带动画效果,不过这个是不带Animation的,晚上自己回家没事就实现了下。
下面说下思路吧,就是先获取TextView完全展开时的最大maxLines记录下来,让后再把TextView的maxLine设置为你想指定的任何值,我这里指定的是1,这样加载完成VIew之后我们看到的TextView就不是完全展开的,这样做的主要目的是拿到完全展开的maxLines,让后用户点击的时候不断的更新maxLine大小即可。
至于如何在onCreate里面捕获到最大的maxLines,我们可以这样做,用View类中的getViewTreeObserver方法,可以获取到指定View的观察者,在绘制控件前的一刹那进行回调,这样速度上又不耽误,得到的数据由是准确的,但此方法在之后可能会被反复调用,因此需要加入限制,普通需求下,只用View类中的getViewTreeObserver方法,可以获取到指定View的观察者,在绘制控件前的一刹那进行回调,这样速度上又不耽误,得到的数据由是准确的,但此方法在之后可能会被反复调用,因此需要加入限制,普通需求下,只计算一次就够了计算一次就够了。
具体实现请看代码吧,代码上面都有注释我就不一一解释了。
package cn.mytest.expandtextview;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
private static final int MAX = 1;//初始maxLine大小
private static final int TIME = 20;//间隔时间
private int maxLines;
private TextView textView;
private boolean hasMesure = false;
private Thread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
//获取ViewTreeObserver View观察者,并注册一个监听事件,这个时间是在View还未绘制的时候执行的,也就是在onDraw之前
//textView默认是没有maxLine限制的,这样我就可以计算到完全显示的maxLine
textView = (TextView) findViewById(R.id.textView);
ViewTreeObserver viewTreeObserver = textView.getViewTreeObserver();
viewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
//只需要获取一次就可以了
if(!hasMesure){
//这里获取到完全展示的maxLine
maxLines = textView.getLineCount();
//设置maxLine的默认值,这样用户看到View就是限制了maxLine的TextView
textView.setMaxLines(MAX);
hasMesure = true;
}
return true;
}
});
textView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
toggle();
}
/**
* 打开TextView
*/
@SuppressLint("HandlerLeak")
private void toggle(){
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int lines = msg.what;
//这里接受到消息,让后更新TextView设置他的maxLine就行了
textView.setMaxLines(lines);
textView.postInvalidate();
}
};
if(thread != null)
handler.removeCallbacks(thread);
thread = new Thread(){
@Override
public void run() {
int count = MAX;
while(count++ <= maxLines){
//每隔20mms发送消息
Message message = new Message();
message.what = count;
handler.sendMessage(message);
try {
Thread.sleep(TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
super.run();
}
};
thread.start();
}
}
源代码:http://download.youkuaiyun.com/detail/wy353208214/6006237