Android—文字轮播
16lz
2021-01-23
1.新建类
import android.content.Context;import android.graphics.Color;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.util.Log;import android.view.Gravity;import android.view.View;import android.view.animation.AnimationUtils;import android.widget.TextSwitcher;import android.widget.TextView;import android.widget.ViewSwitcher;import androidx.annotation.NonNull;import java.util.List;import java.util.Timer;import java.util.TimerTask;public class LunBo1 extends TextSwitcher implements ViewSwitcher.ViewFactory { private int index = -1;//轮播内容索引 private Context context;//上下文 private List<String> list;//轮播内容 public LunBo1(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; //设置轮播进出的动画 setInAnimation(AnimationUtils.loadAnimation(context, R.anim.in));//进 setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.out));//出 //指定Factory 必不可少 this.setFactory(this); } /** * 构造一个TextView * * @return TextView */ @Override public View makeView() { TextView textView = new TextView(context); textView.setTextColor(Color.parseColor("#000000")); textView.setTextSize(20); textView.setGravity(Gravity.CENTER_VERTICAL); return textView; } /** * 设置轮播内容 * * @param list */ public void setList(List<String> list) { this.list = list; } /** * 变更轮播显示内容 */ private void next() { index++; if (index == list.size()) { index = 0; } Log.e("index", index + ""); setText(list.get(index)); } //UI线程中调用next() Handler mHandler = new Handler() { @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); if (msg.what == 666) { next(); } } }; //循环通知Handler TimerTask mTimerTask = new TimerTask() { @Override public void run() { mHandler.sendEmptyMessage(666); } }; /** * 设置轮播间隔,开始循环轮播 * * @param time */ public void setTime(long time) { new Timer().scheduleAtFixedRate(mTimerTask, 0, time); } /** * 获取当前轮播内容的索引 * * @return */ public int getIndex() { return index; } /** * 停止轮播,用于控制循环的子线程 */ public void stop() { mTimerTask.cancel(); }}
2.xml动画资源文件
2.1 进入效果in.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="1000" android:fromXDelta="-100%" android:toXDelta="0%" /> <alpha android:duration="1500" android:fromAlpha="0" android:toAlpha="1" />set>
2.2 离开效果out.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="1000" android:fromXDelta="0%" android:toXDelta="100%" /> <alpha android:duration="800" android:fromAlpha="1" android:toAlpha="0" />set>
Activity中使用
private LunBo1 lunBo;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_refresh);initView();//轮播内容数据List<String> list = new ArrayList<>();list.add("这是文字轮播测试内容1");list.add("这是文字轮播测试内容2");list.add("这是文字轮播测试内容3");list.add("这是文字轮播测试内容4");//设置轮播内容数据,必须写在setTime之前lunBo.setList(list);//设置轮播间隔时间,开始轮播lunBo.setTime(4000);//轮播点击事件,获取当前轮播内容的索引lunBo.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//获取索引int index = lunBo.getIndex();Toast.makeText(RefreshActivity.this, "点击了"+index, Toast.LENGTH_SHORT).show();}});}/** * 为了线程安全,在onDestroy()生命周期中停止轮播 */@Overrideprotected void onDestroy() {super.onDestroy();//停止轮播lunBo.stop();}
更多相关文章
- 理解Android UI线程
- Android 采用DOM解析XML内容 【学习记录】
- Android查看手机线程指令
- Android 多线程下载
- Android studio 3.0和unity交互 Manifest文件修改后正确的内容
- Android EditText输入内容时挤压上面的activity的解决办法
- Android 广播获取短信内容
- FregServer进程,启动Binder线程池,睡眠等待在proc->wait
- android]Android 线程优先级修改