TextView展开加动画效果实现

package com.example.textviewdemo;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.View.OnClickListener;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.TextView;
import android.widget.RelativeLayout.LayoutParams;

/**
 * 
 * @author Teiron
 * 
 */
@SuppressLint("HandlerLeak")
public class TextViewActivity extends Activity implements OnClickListener {
	protected static final String TAG = "TextViewActivity";

	protected static final int UPDATE_SELF   = 0;
	protected static final int OFFSET        = -35;//指定负数
	protected static int       INIT_LINES    = 3;
	protected static final int REFRESH_TIME  = 10;
	
	private TextView mTVcontent;
	protected int totalHeigh;
	private boolean isExpanded;
	
	Handler mHandler = new Handler() {
		private int offset;
		private int height;
		private int initHeight;
		public void dispatchMessage(android.os.Message msg) {
			switch (msg.what) {
			case UPDATE_SELF:
				if (msg.arg1 != 0) {
					offset = msg.arg1;
					mTVcontent.setMaxLines(Integer.MAX_VALUE);
					height     = mTVcontent.getMeasuredHeight();
					initHeight = mTVcontent.getLineHeight()*INIT_LINES;
//					Log.e(TAG,height+"::offset__"+offset);
				}
				height += offset;
				if (height > totalHeigh) {
					height = totalHeigh;
				}
				if (height < initHeight) {
					height = initHeight-offset;
				}
				LayoutParams params = new LayoutParams(
						LayoutParams.WRAP_CONTENT, height);
				mTVcontent.setLayoutParams(params);
				if (height < totalHeigh && height > initHeight) {
					mHandler.sendEmptyMessageDelayed(UPDATE_SELF, REFRESH_TIME);
				}
				break;
			}
			;
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView();
		findviewById();
		setListener();
		processData();
	}

	private void processData() {
		ViewTreeObserver vto = mTVcontent.getViewTreeObserver();
		vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
			@SuppressLint("NewApi")
			public void onGlobalLayout() {
				totalHeigh = mTVcontent.getHeight();
				if(INIT_LINES>mTVcontent.getMaxLines()){
					INIT_LINES = mTVcontent.getMaxLines();
				}
				mTVcontent.setMaxLines(INIT_LINES);
				mTVcontent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
			}
		});
	}
	
	private void toggle() {
		if (!mHandler.hasMessages(UPDATE_SELF)) {
			Log.e("TAG", "HANDLER MESSAGE");
			Message msg = Message.obtain();
			msg.what = UPDATE_SELF;
			if (!isExpanded) {
				isExpanded = !isExpanded;
				msg.arg1 = Math.abs(OFFSET);
			} else {
				isExpanded = !isExpanded;
				msg.arg1 = OFFSET;
			}
			mHandler.sendMessage(msg);
		}
	}
	
	private void setListener() {
		mTVcontent.setOnClickListener(this);
	}

	private void findviewById() {
		mTVcontent = (TextView) findViewById(R.id.textview);
	}

	private void setContentView() {
		setContentView(R.layout.activity_main);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.textview:
			toggle();
			break;
		}
	}

}
改天把它改成自定义控件;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值