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

Android跑马灯两种方式

2016-07-13 14:25 399 查看
第一中方式:TextView实现

<TextView
android:id="@+id/text_sign_message"
android:layout_width="match_parent"
android:layout_height="31dp"
android:background="@color/sign_notice"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center_vertical"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="签到奖励规则变更通知:连续第1、2、3、4、5、6、7....."
android:textColor="@color/sign_notice_text"
android:textSize="@dimen/normal_13"/>
android:focusable="true"
android:focusableInTouchMode="true"获取焦点,没有焦点跑马灯效果不能实现
<pre name="code" class="html">android:marqueeRepeatLimit="marquee_forever"无限循环



第二种实现效果,自定义控件

public class MarqueeTextView extends TextView{

/**
* 是否停止滚动
*/
private boolean mStopMarquee;
private String mText;//文本内容
private float mTextWidth;//文本宽度
private int speed = 1;//滚动速度
private float mCoordinateX = 0;//当前滚动位置

public MarqueeTextView(Context context) {
super(context);
}

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

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

public int getSpeed() {
return speed;
}

/**
* 设置速度
*
* @return
*/
public void setSpeed(int speed) {
this.speed = speed;
}

public void setText(String text) {
this.mText = text;
mTextWidth = getPaint().measureText(mText);
if (mHandler.hasMessages(0))
mHandler.removeMessages(0);
mHandler.sendEmptyMessageDelayed(0, 0);
}

@Override
protected void onAttachedToWindow() {

mStopMarquee = false;
if (!isEmpty(mText))
mHandler.sendEmptyMessageDelayed(0, 0);
super.onAttachedToWindow();
}

@Override
protected void onDetachedFromWindow() {
mStopMarquee = true;
if (mHandler.hasMessages(0))
mHandler.removeMessages(0);
super.onDetachedFromWindow();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!isEmpty(mText))
canvas.drawText(mText, mCoordinateX, dp2px(20), getPaint());
}

private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:

if (mCoordinateX < (-mTextWidth)) {//文字滚动完了,从滚动区域的右边出来
mCoordinateX = getWidth();
invalidate();
if (!mStopMarquee) {
sendEmptyMessageDelayed(0, 30);
}

} else {
mCoordinateX -= speed;
invalidate();
if (!mStopMarquee) {
sendEmptyMessageDelayed(0, 30);
}

}
break;
}
super.handleMessage(msg);
}
};

public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}

public int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, this.getResources().getDisplayMetrics());
}

}
使用

<MarqueeTextView
android:id="@+id/text_sign_message"
android:layout_width="match_parent"
android:layout_height="31dp"
android:background="@color/sign_notice"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="@color/sign_notice_text"
android:textSize="@dimen/normal_13"/>

mSignMessage_text = (MarqueeTextView) mSignIntehralHead.findViewById(R.id.text_sign_message);
mSignMessage_text.setText("签到奖励规则变更通知:连续第1、2、3、4、5、6、7天签到,分别送20、25、30、35、40、45、50积分,连续签到超过7天后,每天固定送50积分");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息