總網頁瀏覽量

關於我自己

我的相片
人生的必修課是接受無常,人生的選修課是放下執著。

2012年2月21日 星期二

Focus/Select/Pressed vs 換圖/改變字體顏色

在此以TextView與GridView為例:

TextView必須設定focus屬性, 才能使focused/pressed行為生效, 即這兩行
    android:focusable="true"
    android:focusableInTouchMode="true"

<TextView
    android:id="@+id/tv_communication"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/Communication"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:textColor="@drawable/selector_communication_textcolor"
    android:background="@drawable/selector_communication_background"
    />


接下來需要在./res/drawable/自訂.xml來規範focused/pressed行為
state_focused="true"時, 字體顏色為黑色
state_pressed="true"時, 字體顏色為紅色

<item
    android:color="@color/white"
    />
表示既沒有focused也沒有pressed時, 字體顏色為白色

./res/drawable/selector_communication_textcolor.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_focused="true"
        android:state_pressed="false"
        android:color="@color/black"
        />
    <item
        android:state_focused="true"
        android:state_pressed="true"
        android:color="@color/red"
        />
    <item
        android:state_focused="false"
        android:state_pressed="true"
        android:color="@color/red"
        />
    <item
        android:color="@color/white"
        />
</selector>

state_focused="true"時, 換一張背景圖label_focus.png
state_pressed="true"時, 換一張背景圖label_pressed.png
既沒有focused也沒有pressed時, 表示沒有圖
./res/drawable/selector_communication_background.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_focused="true"
        android:state_pressed="false"
        android:drawable="@drawable/label_focus"
        />
    <item
        android:state_focused="true"
        android:state_pressed="true"
        android:drawable="@drawable/label_pressed"
        />
    <item
        android:state_focused="false"
        android:state_pressed="true"
        android:drawable="@drawable/label_pressed"
        />
</selector>

在GridView中不必設
    android:focusable="true"
    android:focusableInTouchMode="true"
因為它有專屬的屬性可以建立這種功能, 即android:listSelector
android:verticalSpacing="40dip"←表示每一列資料的垂直間隔是40dip
android:numColumns="6"          ←表示每一列可以放6筆資料
android:fadingEdge="none"       ←當資料超過頁面需要拖拉時, 不要產生陰影的特殊效果

<GridView
    android:id="@+id/gv_list"
    android:listSelector="@drawable/selector_list_background"
    android:verticalSpacing="40dip"
    android:numColumns="6"
    android:fadingEdge="none"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

一樣在./res/drawable/自訂.xml來規範focused/pressed行為
state_focused="true"時, 換一張圖item_focus.png
state_pressed="true"時, 換一張圖item_pressed.png
既沒有focused也沒有pressed時, 表示沒有圖
./res/drawable/selector_list_background.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_focused="true"
        android:state_pressed="false"
        android:drawable="@drawable/item_focus"
        />
    <item
        android:state_focused="true"
        android:state_pressed="true"
        android:drawable="@drawable/item_pressed"
        />
    <item
        android:state_focused="false"
        android:state_pressed="true"
        android:drawable="@drawable/item_pressed"
        />
</selector>

但在變換TextView文字的部份, 有一種作法是再寫一個layout來定義GridView的資料內容

./res/layout/gridview_item.xml
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
<TextView
    android:id="@+id/name"
    android:layout_width="280dp"
    android:layout_height="280dp"   
    android:textColor="@drawable/selector_list_textcolor"
    />
</LinearLayout>

gridview_item.xml的引用會在source code裡
LayoutInflater mInflater;
public View getView(int position, View convertView, final ViewGroup parent)
{
    if (convertView == null)
    {
        convertView = mInflater.inflate(R.layout.gridview_item, null);
    }
    .
    .
    .
}

值得注意的是, 在此得用selected/pressed
state_selected="true"時, 字體顏色為黑色
state_pressed="true"時, 字體顏色為紅色

<item
    android:color="@color/white"
    />
表示既沒有selected也沒有pressed時, 字體顏色為白色

./res/drawable/selector_list_textcolor.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_selected="true"
        android:state_pressed="false"
        android:color="@color/black"
        />
    <item
        android:state_selected="true"
        android:state_pressed="true"
        android:color="@color/red"
        />
    <item
        android:state_selected="false"
        android:state_pressed="true"
        android:color="@color/red"
        />
    <item
        android:color="@color/white"
        />
</selector>

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
至於前面提到的
android:color="@color/black"
android:color="@color/red"
android:color="@color/white"
則是預先在./res/values/colors.xml中定義好
<resources>
    <color name="black">#000000</color>
    <color name="red">#FF0000</color>
    <color name="white">#FFFFFF</color>
</resources>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

沒有留言:

張貼留言