1. 程式人生 > >android學習:TextView 跑馬燈的實現

android學習:TextView 跑馬燈的實現

最近無意間看到了涉及到跑馬燈效果的程式碼,於是在網上查閱了很多資料,在這裡對自己看的一些文章進行一下總結,順便加上自己的一些體會。

讓我們一步步逐漸向下。

首先我們要實現走馬燈這樣一個效果,通常來說都是在TextView這個控制元件中來實現的,而且其中的文字一定是單行顯示,如果多行顯示,那走馬燈效果

也就失去了存在的意義。另外,在EditText中使用走馬燈沒有必要,也不合理,實際上對於EditText來說android:ellipsize這個屬性只有對於設定在android:hint中的文字

的時候是有用的,而且android:ellipsize="marquee"這個用法不能用在EditText控制元件上。對於在EditText使用者輸入的文字,android:ellipsize這個屬性沒有用處。關於EditText

設定android:ellipsize的相關用法以後再講,在這裡也算留個標記,以防自己忘了。

在TextView中實現我們的走馬燈效果,需要兩個屬性android:singleLine="true",以及android:ellipsize="marquee",我們來看下面的程式碼:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical">
  6.     <TextView
  7.         android:layout_width="100dip"
  8.         android:layout_height="wrap_content"
  9.         android:layout_gravity="center"
  10.         android:text="走馬燈效果的演示"
  11.         android:singleLine="true"
  12.         android:ellipsize
    ="marquee"/>
  13. </LinearLayout>

執行這段程式碼之後,我們會發現走馬燈效果並沒有顯示出來,顯示出的文字是不動的,實際效果如下:

這其中的原因在於跑馬燈效果需要TextVIew獲得當前的焦點(focus)。然而對於TextView這個控制元件來說,他的預設的Clickable,LongClickable,Focusable,

FocusableInTouchMode這四個屬性的值都是false,所以跑馬燈效果也就不會出來了,即使你用手觸控TextView或者按下手機上的導航按鍵(現在的手機沒這

個東東了都。。。)也是無法顯示跑馬燈的效果的。

解決這個問題我們就需要讓我們的TextView得到焦點,這裡主要涉及android:focusable和android:focusableInTouchMode這兩個屬性,簡單來說把這兩個屬性都設定成

true,那麼在執行程式以後跑馬燈效果就顯示出來了,這裡就不再貼這兩行程式碼了。

但是細細品味這兩個屬性之後發現其中其實還是有一些玄機的:

1.。如果這兩個屬性設定成android:focusable="true"以及android:focusableInTouchMode="false",那麼會發現程式執行之後,走馬燈效果沒有出現,

這個時候需要使用者按下手機或者模擬器上的上下導航鍵,才能讓走馬燈的效果出現,這說明android:focusable是針對於手機按鍵有效的,然而根據api的解釋,

android:focusableInTouchMode是根據螢幕觸控決定的。

2。如果這兩個屬性設定成android:focusable="false"與android:focusableInTouchMode="true",那麼無論如何走馬燈都出現不了了,就算加上android:clickable="true"

也不行,這說明 android:focusable="true"是android:focusableInTouchMode="true"能有效的先決條件,我推測可能是在原始碼實現中,android:focusableInTouchMode

的邏輯是巢狀在android:focusable中的,這個有待於以後進一步的研究,路漫漫其修遠兮。。。

3。在把這兩個屬性都設定成true以後,會發現程式執行之後,走馬燈效果自動就顯現了出來,這說明應用在執行後,會自動地按照某種順序(在這裡應該是自上而下),

尋找第一個android:focusableInTouchMode="true"這個屬性有效的第一個控制元件,當然要使這個屬性有效按照前面的討論android:focusable="true"也必須具備。根據測試,

LinearLayout的Clickable,LongClickable,Focusable,FocusableInTouchMode這四個屬性預設也都是false,因此,在上面的例子中TextView就率先獲得了焦點,

走馬燈也就走了起來了。

這裡我們做一下驗證,首先將程式碼修改為:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical"
  6.     android:focusable="true">
  7.     <TextView
  8.         android:layout_width="100dip"
  9.         android:layout_height="wrap_content"
  10.         android:layout_gravity="center"
  11.         android:text="走馬燈效果的演示"
  12.         android:singleLine="true"
  13.         android:ellipsize="marquee"
  14.         android:focusable="true"
  15.         android:focusableInTouchMode="true"
  16.         ></TextView>
  17. </LinearLayout>


也就是為LinearLayout加上了android:focusable="true"然後執行應用,會發現TextView的走馬燈照走不誤:

然後我們為LinearLayout加上android:focusableInTouchMode="true"然後再執行,會發現走馬燈失效了。

這裡也就驗證了我們總結的第三條結論。

但是稍等,我們在這裡又發現問題了!現在無論我們怎麼點選導航按鈕,又或是點選螢幕上的TextView走馬燈死活都走不出來了。這是怎麼回事呢?

讓我們理順一下思路,按照我們前面的總結,走馬燈要想有效,TextView必須要得到焦點,現在走馬燈出不來,說明TextView沒有得到焦點。

這裡有兩個情況,一是導航按鈕無法讓TextView或得焦點,二是螢幕點選無法讓TextView獲得焦點。

先看第一種情況,第一種情況的原因在於使用導航按鈕切換焦點預設的的方式會跳過內部控制元件,說白了,上面例子裡面的TextView在LinearLayout裡面,現在

LinearLayout有焦點,如果你按導航按鈕上下按鍵,焦點只會在LinearLayout同層次的控制元件之間切換,不會進入到Linearlayout內部,為了驗證這個結論,我們使用

下面的程式碼:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical"
  6.     >
  7.     <LinearLayoutandroid:layout_width="fill_parent"
  8.         android:layout_height="100dip"
  9.         android:focusable="true"
  10.         android:focusableInTouchMode="true"/>
  11.     <TextView
  12.         android:layout_width="100dip"
  13.         android:layout_height="wrap_content"
  14.         android:layout_gravity="center"
  15.         android:text="走馬燈效果的演示"
  16.         android:singleLine="true"
  17.         android:ellipsize="marquee"
  18.         android:focusable="true"
  19.         android:focusableInTouchMode="true"
  20.         ></TextView>
  21. </LinearLayout>

然後我們執行程式,會發現開始的時候走馬燈沒有自動執行,因為這時候焦點在程式碼裡面的第二個LinearLayout那裡,然後我們按下導航下按鍵,會發現走馬燈效果出來了,

這裡我就不貼圖了。

但是稍等,再重新執行應用,不要按導航按鍵,然後我們這個時候用手指或者說模擬器裡的滑鼠繼續點選TextView,會發現走馬燈還是沒有出現。

這個時候我們來到了第二種情況了。

這裡的問題可以總結為,除了應用第一次開啟的時候,應用自動尋找到android:focusableInTouchMode="true"屬性有效的控制元件冰賦予焦點,我們要如何

自行通過點選螢幕的方式使一個控制元件獲得焦點,在這種情況之下控制元件想要獲得焦點的流程是什麼。

這方面的資料我沒有查到,所以只能自己做一些試驗,然後總結。有盲人摸象的嫌疑,但是我認為在某種程度上是管用的,繼續。

首先我們將程式碼修改為如下所示:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical"
  6.     >
  7.     <LinearLayoutandroid:layout_width="fill_parent"
  8.         android:layout_height="100dip"
  9.         android:focusable="true"
  10.         android:focusableInTouchMode="true"
  11.         />
  12.     <TextView
  13.         android:layout_width="100dip"
  14.         android:layout_height="wrap_content"
  15.         android:layout_gravity=

    相關推薦

    android學習TextView 馬燈實現

    最近無意間看到了涉及到跑馬燈效果的程式碼,於是在網上查閱了很多資料,在這裡對自己看的一些文章進行一下總結,順便加上自己的一些體會。 讓我們一步步逐漸向下。 首先我們要實現走馬燈這樣一個效果,通常來說都是在TextView這個控制元件中來實現的,而且其中的文

    Android應用中TextView馬燈效果

    往往有很多時候我們所使用的TextView能顯示的內容字數是有限的,有時當我們要設定的內容長度過長時,我們的UI頁面就會出現一些不和諧的現象。 處理方法(很少有人把...放在前面的吧…^ v ^): 1,尾部(...)處理      android:ellipsize=

    Android監聽TextView馬燈的狀態

    最近專案需要一個需求,要求在TextView跑馬燈狀態結束後隱藏整個控制元件。可惜android並沒有提供這樣介面來通知我們跑馬燈狀態是否結束,因此我們只能自己來做。最開始一點思路都沒有,後來想了一個

    android 6.0 textview 馬燈失效和出現抖動的解決方法

    最近搞個專案,要在地圖上顯示天氣資訊,我使用了個textview加跑馬燈效果進行滾動顯示,一切都很正常。 前幾天測試在6.0系統的機子上進行了測試,發現跑馬燈失效了,一直在抖動。感覺像是6.0相容性上

    一、Android 實現兩個TextView馬燈效果

    超長的文字在有限的佈局中,實現一行迴圈顯示?如果是隻有一個TextView實現跑馬燈效果可以簡單使用以下方式來實現: <TextView android:layout_width="wrap_content" android:layout

    關於Android實現TextView馬燈效果

    在xml屬性中設定 <TextView android:width="wrap_content" android:height="wrap_content" android:singleLine="true" andr

    Android 自定義馬燈 實現超長文字,滾動完當前在繼續切換下一條

    1 前言 最近專案上有一個跑馬燈的需求。 需求: 無限滾動,可以自動切換下一條 如果當前的文字超過一屏,則滾動完當前再切換下一條 第一點很簡單,但是第二點就比較蛋疼了,看了網上很多輪子都沒有太合適的,於是自己寫了一個。 記錄總結一下Android 跑馬燈的

    簡單實現TextVIew馬燈效果

    <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="莫聽穿林打葉聲,何妨吟嘯且徐行。竹杖芒鞋輕勝馬,誰怕?一蓑煙雨任平生。 "

    Android-TextView馬燈效果

    1.讓很多文字一行顯示,預設是false,設定為true; android:singleLine="true" 2.對文字進行裁剪,預設是end裁剪; android:ellipsize="end"    3.設定文字裁剪為start,設定一行顯示:

    TextView馬燈-兩種實現方式

    Android中TextView跑馬燈有多種實現方式; 一種是自定義控制元件,另外一種是寫一個工具類 自定義控制元件 /** * Created by iblade.Wang on 2018/10/24 10:29 */ public class Marqu

    android TextView 馬燈效果

    /**  * Created by Darren on 2015/2/23.  * 設定所有的TextView都有跑馬燈效果  */ public class marqueeText extends TextView {     public

    Android 上下滾動(馬燈)效果實現

    產品的有個需求是 文字上下滾動,第一想到的是用屬性動畫實現,2個TextView 切換滾動,網上看了一堆資料大部分都是 TextSwitch,寫部落格不貼效果圖真的是很惆悵,不知道具體效果如何,第一次進入切換是否有問題,還有就是最後一個切換到第二個是否有問題,動畫是否流暢等,

    Android TV控制元件之TextView馬燈

      在TV開發中,很多時候TextView都需要實現跑馬燈效果。但是跑馬燈效果僅在TextView獲取焦點的時候才會有效,那麼我們如何在沒有焦點的時候讓TextView產生跑馬燈效果呢。   現在網上

    Android開發之縱向馬燈效果實現

    我們看淘寶、京東等app軟體,首頁就會看到那廣告詞向上走。。。今天我給大家帶來兩種實現方式。效果圖就不上啦,直接上程式碼: 一,自定義view 1,之前經常用findViewById(),今天用另一種方式來找控制元件。在app/build.gradle的閉包

    Android TextView 馬燈效果和 EditText 衝突

            1.在程式中 TextView 跑馬燈效果和 EditText 衝突 是由於獲取焦點的地方衝突了。所有要將 EdiText  Android:focusTouch設定為false。但是EditText將

    android TextView馬燈 讓字型滾動起來

    一個介面中,只能有一個textView獲得焦點,暫時只能讓一個textView的文字滾動起來 第一步自定義控制元件 public class Marquee extends TextView {

    Android學習實現複雜的列表項

    實現複雜的列表項,這裡實現的是帶圖片的列表項,主要任務的寫一個BaseAdapter的子類,不過在這之前先構造個存列表項資料的類ListViewCellData,實現建構函式和幾個get方法即可,再在BaseAdapter中構造個數組存放幾組測試資料: public cla

    Android 自定義View之TextView馬燈效果

    public class MarqueeView extends SurfaceView implements SurfaceHolder.Callback{ public Context mContext; private float mTextSize = 100; //字型大小

    xamarin android TextView馬燈效果和EditText焦點衝突的問題

    在實現androd textview跑馬燈效果的時候,和EditText的焦點事件衝突了,一旦EditText獲取焦點以後,textview文字就不再滾動。網上查資料,大部分的解決方法都是重寫TextView,然後重寫OnFocusChanged事件和IsFoc

    TextView馬燈的兩種實現

    普通的TextView可以實現跑馬燈,但是隻有當焦點在它上面時才有效。 如何做一個自動的跑馬燈呢? 第一種:繼承TextView,然後重寫isFocused()方法就可以了,簡單! Java程式碼   import android.content.Context;