解决Android跑马灯不动问题

布局配置

首先来看一下请的布局吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/LayoutFFStyle"
android:orientation="vertical"
android:background="#F6F4EE">

<RelativeLayout
style="@style/LayoutFWStyle"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:background="#EEEEEE"
android:paddingTop="5dip"
android:paddingBottom="5dip">

<LinearLayout
style="@style/LayoutWFStyle"
android:orientation="horizontal"
android:layout_alignParentLeft="true"
android:layout_margin="10dip">

<TextView
android:layout_width="100dip"
android:layout_height="wrap_content"
android:textColor="#000000"
android:text="AppBlog.CN APP开发技术博客, AppBlog.CN APP开发技术博客"
android:ellipsize="marquee"
android:focusable="true"
android:marqueeRepeatLimit="marquee_forever"
android:focusableInTouchMode="true"
android:scrollHorizontally="true"
android:textSize="18sp"
android:singleLine="true"
android:layout_marginLeft="5dip"/>

<TextView
android:id="@+id/search_result_list_item_percapita"
style="@style/LayoutWWStyle"
android:textColor="#000000"
android:paddingLeft="5dip"
android:textSize="18sp"
android:gravity="center_vertical"/>
</LinearLayout>

<LinearLayout
style="@style/LayoutWFStyle"
android:orientation="horizontal"
android:layout_margin="10dip"
android:layout_alignParentRight="true">

<TextView
style="@style/LayoutWWStyle"
android:gravity="center_vertical"
android:paddingRight="5dip"
android:text="386m"/>

<ImageView
style="@style/LayoutWWStyle"
android:layout_gravity="center_vertical"
android:src="@drawable/arrow_right_gray"/>
</LinearLayout>
</RelativeLayout>

<Gallery
android:id="@+id/search_result_foot_gallery"
style="@style/LayoutFWStyle"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:spacing="10dip"
android:scrollbars="none"
android:fadingEdge="none"
android:unselectedAlpha="1"/>
</LinearLayout>

说明一下,这个布局是在ListView中item,在adapter去引用的,跑马灯最后就不滚动。解决方法:

设置焦点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<TextView
android:layout_width="100dip"
android:layout_height="wrap_content"
android:textColor="#000000"
android:text="AppBlog.CN APP开发技术博客, AppBlog.CN APP开发技术博客"
android:ellipsize="marquee"
android:focusable="true"
android:marqueeRepeatLimit="marquee_forever"
android:focusableInTouchMode="true"
android:scrollHorizontally="true"
android:textSize="18sp"
android:singleLine="true"
android:hapticFeedbackEnabled="true"
android:layout_marginLeft="5dip">

<requestFocus/>
</TextView>

这种方法在ListView布局下不太靠谱,如果能够在引用这个布局文件中去设置焦点话应该可以用,但是没有试过。

重写TextView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

/**
* 解决跑马灯不动的问题
*/
public class ScrollForeverTextView extends TextView {

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

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;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
<cn.appblog.widget.ScrollForeverTextView 
android:layout_width="100dip"
android:layout_height="wrap_content"
android:textColor="#000000"
android:text="AppBlog.CN APP开发技术博客, AppBlog.CN APP开发技术博客"
android:ellipsize="marquee"
android:focusable="true"
android:marqueeRepeatLimit="marquee_forever"
android:focusableInTouchMode="true"
android:scrollHorizontally="true"
android:textSize="18sp"
android:singleLine="true"
android:layout_marginLeft="5dip"/>

自定义控件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
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.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

import com.lianlianpay.common.config.Constants;
import com.lianlianpay.common.utils.android.NLog;

/**
* 单行文本跑马灯控件
*/
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*/) {
NLog.i(Constants.TAG, "width: " + width);
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();
}

}
1
2
3
4
5
6
7
8
marquee = (AutoScrollTextView) findViewById(R.id.marquee);  
//marquee.setText(String.format(getResources().getString(R.string.marquee0),Consts.termno,"2015-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();

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :