Android TextView实现点击展开动画效果

今天面试遇到的一个问题,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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值