今天要實(shí)現(xiàn)的一個(gè)效果是在Android中實(shí)現(xiàn)一個(gè)跑馬燈的效果:
成都創(chuàng)新互聯(lián)是一家專注于做網(wǎng)站、成都做網(wǎng)站與策劃設(shè)計(jì),烏拉特后網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:烏拉特后等地區(qū)。烏拉特后做網(wǎng)站價(jià)格咨詢:18982081108
在新建一個(gè)Android product之后,在布局文件main中替換掉原來的TextView
代碼如下:
TextView
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:text="這是跑馬燈的效果這是跑馬燈的效果"
/TextView
其他部分代碼不用改動(dòng),在模擬器上應(yīng)該可以看到滾動(dòng)的顯示"這是跑馬燈的效果這是跑馬燈的效果"。
其中有幾個(gè)問題是我自己碰到的,列舉如下:
1.寬度android:layout_width不可以設(shè)置為wrap_content(自適應(yīng)內(nèi)容)
2.android:text最好是比較長(zhǎng)的字符串,最少要長(zhǎng)過自己設(shè)置的width大小(我這里是60dp)
3.顏色最好別設(shè)置為@android:color/white,否則你什么都看不到,因?yàn)楸尘邦伾彩莣hite
4.在xml中,TextView 的屬性
android:ellipsize = "end" 省略號(hào)在結(jié)尾
android:ellipsize = "start" 省略號(hào)在開頭
android:ellipsize = "middle" 省略號(hào)在中間
android:ellipsize = "marquee" 跑馬燈
5.android:scrollHorizontally="true"相信大家英文水平還不錯(cuò)的話都明白這句的意思是水平滾動(dòng)
6.android:marqueeRepeatLimit="marquee_forever" 看英文同樣可以明白,是無限次循環(huán),學(xué)習(xí)android,英文基礎(chǔ)還是必須的。
7.最后還有兩句代碼沒有解釋:
android:focusable="true" //讓TextView獲得焦點(diǎn)
android:focusableInTouchMode="true" //針對(duì)觸摸屏獲得當(dāng)前焦點(diǎn)
事實(shí)上這兩句代碼我也了解不是特別多,在網(wǎng)上查了下這兩個(gè)屬性,目前理解為:
android:focusable="true"相當(dāng)于當(dāng)前Activity打開的時(shí)候,讓當(dāng)前控件TextView獲得焦點(diǎn),才可以實(shí)現(xiàn)滾動(dòng)功能
android:focusableInTouchMode="true"和上述屬性應(yīng)該是類似的,但限制應(yīng)該是指的觸摸屏上的意思
對(duì)于這兩個(gè)屬性,希望有高人指點(diǎn)下。
android跑馬燈有時(shí)候不跑的解決方法
要嚴(yán)格按照下面的設(shè)置順序進(jìn)行設(shè)置,否則在有的手機(jī)上可能不會(huì)有效果。
android:singleLine="true"
android:ellipsize="marquee"
android:focusable="true"
android:marqueeRepeatLimit="marquee_forever"
android:focusableInTouchMode="true"
android:scrollHorizontally="true"
Android自帶的跑馬燈效果不太好控制,不能控制速度,不能即時(shí)停止和啟動(dòng),而且還受焦點(diǎn)的影響蛋疼不已。由于項(xiàng)目需求需要用的可控制性高的跑馬燈效果,所以自己寫了一個(gè)自定義的TextView
注意:在布局文件引用本view時(shí),paddingLeft,paddingRigh都必須為0dp,需要增加這兩個(gè)屬性的,大家可以自行修改代碼。
android:ellipsize="marquee"?android:singleLine="true"?這兩個(gè)屬性也要加上
public?class?MarqueeText?extends?TextView?implements?Runnable?{
private?int?currentScrollX;//?當(dāng)前滾動(dòng)的位置
private?boolean?isStop?=?false;
private?int?textWidth;
private?boolean?isMeasure?=?false;
public?MarqueeText(C
ontext?context)?{
super(context);
//?TODO?Auto-generated?constructor?stub
}
public?MarqueeText(Context?context,?AttributeSet?attrs)?{
super(context,?attrs);
}
public?MarqueeText(Context?context,?AttributeSet?attrs,?int?defStyle)?{
super(context,?attrs,?defStyle);
}
@Override
protected?void?onDraw(Canvas?canvas)?{
//?TODO?Auto-generated?method?stub
super.onDraw(canvas);
if?(!isMeasure)?{//?文字寬度只需獲取一次就可以了
getTextWidth();
isMeasure?=?true;
}
}
/**
*?獲取文字寬度
*/
private?void?getTextWidth()?{
Paint?paint?=?this.getPaint();
String?str?=?this.getText().toString();
textWidth?=?(int)?paint.measureText(str);
}
@Override
public?void?run()?{
currentScrollX?-=?2;//?滾動(dòng)速度
scrollTo(currentScrollX,?0);
if?(isStop)?{
return;
}
if?(getScrollX()?=?-(this.getWidth()))?{
scrollTo(textWidth,?0);
currentScrollX?=?textWidth;
//????????????????????????return;
}
postDelayed(this,?5);
}
//?開始滾動(dòng)
public?void?startScroll()?{
isStop?=?false;
this.removeCallbacks(this);
post(this);
}
//?停止?jié)L動(dòng)
public?void?stopScroll()?{
isStop?=?true;
}
//?從頭開始滾動(dòng)
public?void?startFor0()?{
currentScrollX?=?0;
startScroll();
}
}布局文件:
LinearLayout?xmlns:android=""
xmlns:tools=""
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"?
Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="start"
android:text="走起"?/
Button????????android:id="@+id/stop"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:onClick="stop"????????android:text="停止"?/????Button????????android:id="@+id/startfor0"????????android:layout_width="wrap_content"????????android:layout_height="wrap_content"????????android:onClick="startFor0"????????android:text="從頭開始"?/????simtice.demo.marqueetext.MarqueeText????????android:id="@+id/test"????????android:layout_width="fill_parent"????????android:layout_height="wrap_content"????????android:background="#339320"????????android:ellipsize="marquee"????????android:singleLine="true"????????android:text="這才是真正的文字跑馬燈效果這才是真正的字跑馬燈效果這才是真正的"????????android:textColor="#000000"????????android:textSize="20dp"?????/simtice.demo.marqueetext.MarqueeText/LinearLayoutMainActivitypublic?class?MainActivity?extends?Activity?{????????private?MarqueeText?test;????????@Override????????public?void?onCreate(Bundle?savedInstanceState)?{????????????????super.onCreate(savedInstanceState);????????????????setContentView(R.layout.activity_main);????????????????test?=?(MarqueeText)?this.findViewById(R.id.test);????????}????????public?void?start(View?v)?{????????????????test.startScroll();????????}????????public?void?stop(View?v)?{????????????????test.stopScroll();????????}????????public?void?startFor0(View?v){????????????????test.startFor0();????????}}
跑馬燈相關(guān)屬性
上面方式1能暫時(shí)實(shí)現(xiàn)跑馬燈效果,但在多次點(diǎn)擊事件之后容易失焦。而且在Android4.4上實(shí)現(xiàn)有短暫停頓。
MarqueeTextView
MarqueeTextView
attrs.xml
使用
MarqueeView :可垂直跑、可水平跑的跑馬燈。
MarqueeViewLibrary :一個(gè)很方便使用和擴(kuò)展的跑馬燈Library,通過提供不同的MarqueeFactory來定制不同的跑馬燈View, 并且提供了常用類型的跑馬燈效果:SimpleMarqueeView。
XML
設(shè)置字符串列表數(shù)據(jù),或者設(shè)置自定義的Model數(shù)據(jù)類型
設(shè)置字符串?dāng)?shù)據(jù)
設(shè)置事件監(jiān)聽
在 Activity 或 Fragment 中
在 ListView 或 RecyclerView 的 Adapter 中