您的位置:首页 > 移动开发 > Android开发

android 自定义文字跑马灯 支持拖拽,按住停止滚动,自定义速度

2014-06-06 14:22 381 查看
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() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}

@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub

}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
mCoordinateX += (int) distanceX;
scrollTo(mCoordinateX, 0);
// TODO:设置偏移量,distanceX为滑动距离
return true;
}

@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub

}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
return false;
}

@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
});

xOffset = 0;
mStopMarquee = false;
mText = this.getText().toString();// 获取文本框文本
mCoordinateX = 0;
mTextWidth = (int) Math.abs(getPaint().measureText(mText));
post(this);
}

@Override
public 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;
}

@Override
public 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像素,这是我调试之后感觉比较平滑的一个速度。如果代码有什么错误或者可以改进的地方,希望你们能在评论中指出。谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: