跑馬燈的制作方法,Android 多種跑馬燈的方法

 2023-10-31 阅读 18 评论 0

摘要:轉自http://jsf.iteye.com/blog/680257 http://www.devdiv.com/home.php?mod=space&uid=31865&do=blog&id=11360 http://blog.csdn.net/knlnzhao/article/details/7996969 普通的TextView可以實現跑馬燈,但是只有當焦點在它上面時才有效。

轉自http://jsf.iteye.com/blog/680257

http://www.devdiv.com/home.php?mod=space&uid=31865&do=blog&id=11360

http://blog.csdn.net/knlnzhao/article/details/7996969

普通的TextView可以實現跑馬燈,但是只有當焦點在它上面時才有效。 如何做一個自動的跑馬燈呢?


第一種:繼承TextView,然后重寫isFocused()方法就可以了,簡單!

[代碼]java代碼:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;/**
* 單行文本跑馬燈控件
* @author admin
*
*/public class ScrollForeverTextView extends TextView {public ScrollForeverTextView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}public ScrollForeverTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}public ScrollForeverTextView(Context context, AttributeSet attrs,int defStyle) {
super(context, attrs, defStyle);
}@Override
public boolean isFocused() {
return true;
}}

使用時同TextView一樣:

[代碼]java代碼:

<com.ql.view.ScrollForeverTextView
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:textSize="30px"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:textColor="@color/red" 
android:text="1234567890wwwwwwwwwwwwwwwwwwwwww1234567890"
android:focusable="true"/>

第2種:還是繼承TextView,重寫onDraw(),在onDraw中不停的重繪。

[代碼]java代碼:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.TextView;/**
* 單行文本跑馬燈控件
* @author admin
*/public class AutoScrollTextView extends TextView implements OnClickListener {
public final static String TAG = AutoScrollTextView.class.getSimpleName();private float textLength = 0f;// 文本長度
private float viewWidth = 0f;
private float step = 0f;// 文字的橫坐標
private float y = 0f;// 文字的縱坐標
private float temp_view_plus_text_length = 0.0f;// 用于計算的臨時變量
private float temp_view_plus_two_text_length = 0.0f;// 用于計算的臨時變量
public boolean isStarting = false;// 是否開始滾動
private Paint paint = null;// 繪圖樣式
private CharSequence text = "";// 文本內容
private float speed = 0.5f;
private int textColor=0xFF000000;public int getTextColor() {
return textColor;
}public void setTextColor(int color) {
this.textColor = color;
}public float getSpeed() {
return speed;
}public void setSpeed(float speed) {
this.speed = speed;
}public AutoScrollTextView(Context context) {
super(context);
initView();
}public AutoScrollTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}/**
* 初始化控件
*/private void initView() {
setOnClickListener(this);
}/**
* 文本初始化,每次更改文本內容或者文本效果等之后都需要重新初始化一下!
*/public void init(float width/*WindowManager windowManager*/) {
text=super.getText();
paint = super.getPaint();
// Paint paint=new Paint();
text = getText().toString();
textLength = paint.measureText(text.toString());
// viewWidth = getWidth();
// if (viewWidth == 0) {
// if (windowManager != null) {
// Display display = windowManager.getDefaultDisplay();
// viewWidth = display.getWidth();
// }
// }viewWidth=width;
step = textLength;
temp_view_plus_text_length = viewWidth + textLength;
temp_view_plus_two_text_length = viewWidth + textLength * 2;
y = getTextSize() + getPaddingTop();
paint.setColor(textColor);
}@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.step = step;
ss.isStarting = isStarting;
return ss;
}@Override
public void onRestoreInstanceState(Parcelable state) {
if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
step = ss.step;
isStarting = ss.isStarting;
}public static class SavedState extends BaseSavedState {
public boolean isStarting = false;
public float step = 0.0f;
SavedState(Parcelable superState) {
super(superState);
}@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeBooleanArray(new boolean[] { isStarting });
out.writeFloat(step);
}public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {public SavedState[] newArray(int size) {
return new SavedState[size];
}@Override
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
};private SavedState(Parcel in) {
super(in);
boolean[] b = null;
in.readBooleanArray(b);
if (b != null && b.length > 0)
isStarting = b[0];
step = in.readFloat();
}
}/**
* 開始滾動
*/public void startScroll() {
isStarting = true;
invalidate();
}/**
* 停止滾動
*/
public void stopScroll() {
isStarting = false;
invalidate();
}@Override
public void onDraw(Canvas canvas) {
// super.onDraw(canvas);canvas.drawText(text,0,text.length(), temp_view_plus_text_length - step, y, paint);
if (!isStarting) {
return;
}
step += speed;
if (step > temp_view_plus_two_text_length)
step = textLength;
invalidate();
}@Override
public void onClick(View v) {
if (isStarting)
stopScroll();
else
startScroll();}}

[代碼]java代碼:

marquee = (AutoScrollTextView) findViewById(R.id.marquee);// marquee.setText(String.format(getResources().getString(R.string.marquee0),Consts.termno,"2010-12-28"));marquee.setText("上證指數3000.15 6.81(0.37%)深圳成指3000.15 6.81(0.37%)");// marquee.setTextColor(0xffff0000);//注意:顏色必須在這里設置,xml中設置無效!默認黑色。
//如果想改變跑馬燈的文字內容或者文字效果,則在調用完setText方法之后,需要再調用一下init(width)方法,重新進行初始化和相關參數的計算。marquee.setSpeed(1.5f);
marquee.init(width);//width通常就是屏幕寬!
marquee.startScroll();

這2種跑馬燈稍微有點區別,需要掂量著使用。
第1種跑馬燈不能設置速度,并且要超過一行才會滾動。
第2種跑馬燈只能設置單一顏色,且需要在代碼中設置,不能同時設置多種顏色。速度設的不要過大(<=2.0f),否則停頓現象比較明顯。

第三種方法:設置其對應的layout中的:addStatesFromChildren= “true”.使用其獲得焦點時有跑馬燈的效果。

在Android中要顯示跑馬燈是比較容易的,只要設置2個屬性就可以了:
android:singleLine="true"
android:ellipsize="marquee"

但 是要顯示跑馬燈該View必需是可以取得焦點的,只有在取得焦點的情況下跑馬燈才會出現.
如果是組合View的情況下就有問題了, 如下一個組合View:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:gravity
="center_vertical"
android:background
="@drawable/f_background"
android:layout_width
="fill_parent"
android:focusable
="true"
android:layout_height
="50px">
<TextView
android:id="@+id/info_text"
android:focusable
="true"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="testmarquee.."
android:textColor
="@color/black"
android:singleLine
="true"
android:ellipsize
="marquee"
android:marqueeRepeatLimit
="3"
android:textSize
="18sp"
/>
<TextView
android:id="@+id/date_text"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:layout_gravity
="bottom"
android:textColor
="@color/gray"
android:text
="2010/05/28"
android:textSize
="12sp"
/>
</LinearLayout>


上面示例中2個TextView組合為一個View,由于設置了LinearLayout為focusable而TextView就沒法取得焦點了,這樣 這個TextView的跑馬燈效果就顯示不出來,就算你也設置TextView的android:focusable="true" 也是 沒用的. 這個時候就要使用addStatesFromChildren 這個屬性了,在LinearLayout中設置這個屬性,然后設置TextView的focusable="true"就可以了.關于addStatesFromChildren的說明:

Sets whether thisViewGroup's drawablestates also include its children's drawablestates.

可以正常顯示的代碼:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:gravity
="center_vertical"
android:background
="@drawable/zixun_background"
android:layout_width
="fill_parent"
android:addStatesFromChildren
="true"
android:layout_height
="50px">
<TextView
android:id="@+id/info_text"
android:focusable
="true"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
=""
android:textColor
="@color/black"
android:singleLine
="true"
android:ellipsize
="marquee"
android:marqueeRepeatLimit
="3"
android:textSize
="18sp"
/>
<TextView
android:id="@+id/date_text"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:layout_gravity
="bottom"
android:textColor
="@color/gray"
android:text
="2010/05/28"
android:textSize
="12sp"
/>
</LinearLayout>

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/165720.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息