热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自定义可控带跑马灯效果的TextView

前几天遇到的问题,要一个可点击开始滚动,可手动滑动的具有跑马灯效果的textview。从网上收集的一些实例代码,然后自己写了一个分享一下。packagecom.zhengzhou.tongyan.t

前几天遇到的问题,要一个可点击开始滚动,可手动滑动的具有跑马灯效果的textview。从网上收集的一些实例代码,然后自己写了一个分享一下。

package com.zhengzhou.tongyan.tfinal.annotation.view;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.TextView;
/**
* 自定义跑马灯文本框,支持拖拽查看文本内容,点击暂停,继续文字 先设置要显示文本
* 下面两个要在xml文件当中定义
* android:ellipsize="none"
* android:singleLine="true"
* @author yyw 2015-8-10
*/
public class MarqueeTextView extends TextView implements Runnable,OnTouchListener ,OnClickListener{
/** 是否停止滚动 */
private boolean mStopMarquee;
private String mText;// 文字
public int mCoordinateX;
int xOffset;//速度
private int mTextWidth;// 文字的宽度
private GestureDetector gestureDetector;// 手势识别器
//文本框的宽度
private int textViewWidth;
//初始化数据的标志位,只执行一次
private boolean isOnce;

public MarqueeTextView(Context context) {
this(context, null);
}

public MarqueeTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}

private void init(Context context) {
gestureDetector = new GestureDetector(context,
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
if (!mStopMarquee) {
paush();
}
mCoordinateX += distanceX;
if (mCoordinateX > mTextWidth - textViewWidth) {
mCoordinateX = mTextWidth - textViewWidth;
} else if (mCoordinateX <0) {
mCoordinateX = 0;
}
scrollTo(mCoordinateX, 0);

return true;
}
});
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!isOnce) {
isOnce= true;
xOffset = dip2px(getContext(), 1.8f);
mStopMarquee = true;
mCoordinateX = 0;
textViewWidth = getWidth() - getCompoundPaddingLeft()
- getCompoundPaddingRight();
this.setOnTouchListener(this);//不能用onTouchEvent代替
this.setOnClickListener(this);

}
mText = this.getText().toString();// 获取文本框文本
mTextWidth = (int) Math.abs(getPaint().measureText(mText));
}
/**
* 开始滚动
*
* @param text
*/
public void start() {
if (!mStopMarquee) {
return;
}
if (textViewWidth mStopMarquee = false;
postDelayed(this, 50);
}
}

@Override
public void run() {
if (!mStopMarquee) {
mCoordinateX += xOffset;// 滚动速度
scrollTo(mCoordinateX, 0);
if (mCoordinateX > mTextWidth - textViewWidth / 7 * 6) {
scrollTo(0, 0);
mCoordinateX = 0;
mStopMarquee = true;
}
postDelayed(this, 50);
}

}

// 继续滚动
public void continueRunning() {
if (mStopMarquee) {
mStopMarquee = false;
postDelayed(this, 50);
}
}

// 暂停滚动
public void paush() {
mStopMarquee = true;
}


/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}

@Override
public void onClick(View v) {
if (!mStopMarquee) {
paush();
}else {
continueRunning();
}

}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (textViewWidth>=mTextWidth) {
return false;
}
return gestureDetector.onTouchEvent(event);
}

}



推荐阅读
author-avatar
E阳光男孩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有