android 自定义文字跑马灯 支持拖拽,按住停止滚动,自定义速度
16lz
2022-04-16
android的textview自带跑马灯效果,一般使用足够了。不过也有不一般的情况,所以我实现了一个自定义textview控件,用来针对这种不一般情况下的跑马灯效果实现。
import android.content.Context;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.view.GestureDetector.OnGestureListener;import android.view.View.OnTouchListener;import android.widget.TextView;/** * 自定义跑马灯文本框,支持拖拽查看文本内容,点击暂停文字 先设置要显示文本,然后调用Start()方法运行跑马灯 * * @author sy */public class MarqueeTextView extends TextView implements Runnable,OnTouchListener {public MarqueeTextView(Context context) {super(context);}/** 是否停止滚动 */private boolean mStopMarquee;private String mText;public int mCoordinateX;int xOffset;private int mTextWidth;GestureDetector gestureDetector;public MarqueeTextView(Context context, AttributeSet attrs) {super(context, attrs);}public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}/** * 开始滚动 * * @param text */public void Start() {this.setOnTouchListener(this);gestureDetector = new GestureDetector(getContext(),new OnGestureListener() {@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {mCoordinateX += (int) distanceX;scrollTo(mCoordinateX, 0);// TODO:设置偏移量,distanceX为滑动距离return true;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {return false;}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}});xOffset = 0;mStopMarquee = false;mText = this.getText().toString();// 获取文本框文本mCoordinateX = 0;mTextWidth = (int) Math.abs(getPaint().measureText(mText));post(this);}@Overridepublic void run() {if (!mStopMarquee) {mCoordinateX += 3;// 滚动速度scrollTo(mCoordinateX, 0);if (mCoordinateX > mTextWidth) {scrollTo(0, 0);mCoordinateX = 0;}postDelayed(this, 50);}}// 继续滚动public void Continue() {if (mStopMarquee) {mStopMarquee = false;post(this);}}// 暂停滚动public void Paush() {mStopMarquee = true;}@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:case MotionEvent.ACTION_SCROLL:Paush();break;default:Continue();break;}gestureDetector.onTouchEvent(event);return true;}}
首先调用setText设置文本内容,然后调用start()开始滚动。滚动速度为每50毫米移动3像素,这是我调试之后感觉比较平滑的一个速度。如果代码有什么错误或者可以改进的地方,希望你们能在评论中指出。谢谢!
更多相关文章
- android 存储联系人(save contact) 总结
- android对话框大全
- Android梳理 Fragment
- Android(安卓)Audio
- Android(安卓)jni调用,实现自己的JNI_OnLoad函数
- Native+WebApp中Phonegap调用Android(安卓)Activity
- android异步的几种方式
- Android(安卓)MD5加密算法
- Android(安卓)LCD和键盘 背光亮度设置