新浪博客

android textview展开效果 两个例子

2014-04-14 10:10阅读:

cfanicer

90食代联合创始人,互联网讲师

关注
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 sav
edInstanceState) {
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();
}


@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();
}
}
==================================================================================

资源描述:

本例使用TranslateAnimation 给一个ListView的列表项向下逐步展开(Cascade)的动画效果,各种基本Animation可以参见Android ApiDemos示例解析(3): App->Activity->Animation。
本例使用代码为ListView添加LayoutAnimation.
[java]
AnimationSet set = new AnimationSet(true);
Animation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(50);
set.addAnimation(animation);
animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f
);
animation.setDuration(2000);
set.addAnimation(animation);
LayoutAnimationController controller
= new LayoutAnimationController(set, 0.5f);
ListView listView = getListView();
listView.setLayoutAnimation(controller);
AnimationSet set = new AnimationSet(true);
Animation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(50);
set.addAnimation(animation);
animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f
);
animation.setDuration(2000);
set.addAnimation(animation);
LayoutAnimationController controller
= new LayoutAnimationController(set, 0.5f);
ListView listView = getListView();
listView.setLayoutAnimation(controller);
本例Cascade效果是通过TranslateAnimation实现的,本例使用的构造函数:
public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
fromXType: 指出fromXValue的模式,本例使用RELATIVE_TO_SELF,表示使用本View的宽度或是高度。RELATIVE_TO_PARENT为父View的宽度或是高度。ABSOLUTE 表示fromXValue使用绝对值。
fromXValue: 起始X坐标或当fromXType为RELATIVE_TO_PARENT或是RELATIVE_TO_SELF时表示相对于本View或父View的系数。本例向下展开,在X方向无动画,因此设为0.
toXType: 指出toXValue的模式,本例使用RELATIVE_TO_SELF,表示使用本View的宽度或是高度。RELATIVE_TO_PARENT为父View的宽度或是高度。ABSOLUTE 表示fromXValue使用绝对值。
toXValue: 结束X坐标或当fromXType为RELATIVE_TO_PARENT或是RELATIVE_TO_SELF时表示相对于本View或父View的系数。本例向下展开,在X方向无动画,因此设为0.
fromYType: 指出fromYValue的模式,本例使用RELATIVE_TO_SELF,表示使用本View的宽度或是高度。RELATIVE_TO_PARENT为父View的宽度或是高度。ABSOLUTE 表示fromYValue使用绝对值。
fromYValue: 起始Y坐标或当fromYType为RELATIVE_TO_PARENT或是RELATIVE_TO_SELF时表示相对于本View或父View的系数。
toYType: 指出toYValue的模式,本例使用RELATIVE_TO_SELF,表示使用本View的宽度或是高度。RELATIVE_TO_PARENT为父View的宽度或是高度。ABSOLUTE 表示fromXValue使用绝对值。
toYValue: 结束Y坐标或当fromYType为RELATIVE_TO_PARENT或是RELATIVE_TO_SELF时表示相对于本View或父View的系数。本例向下展开,值为1表示向下移动子View的高度。
将动画时间从100改成2000可以较慢的速度显示动画效果。

我的更多文章

下载客户端阅读体验更佳

APP专享