Android ListView實現圓角

jopen 13年前發布 | 59K 次閱讀 Android Android開發 移動開發

首先呢,我們還是看幾個示圖:(這是360推出的一款天氣預報APP(墨跡),很不錯的一款哦,這里為她們做一個免費廣告,哈哈.)

 Android ListView實現圓角        Android ListView實現圓角         Android ListView實現圓角

這種帶有圓角的listview' 看起來很棒吧,確實是這樣,其實也不能這么說,主要方形太多了,斯通見慣就不值錢了,“物以稀為貴嘛”. 就好比學java都搞androd,很明顯嘛,為了多賺點錢,可是供過于求的話,就不這么樂觀了,就好比現在這個圓角,如果太多太多的話,我想若干時間段,肯定會被新的視圖所代替.所以“跟隨潮流,放寬眼線”很重要.不扯了,(網上實現例子很多)下面簡單介紹下實現方法:(兩種方法)

第一種:我們通過配置文件也就是shape自己實現圓角的背景,以及selector選中某項的背景.

首先我們要實現一個完整的圓角背景,用于默認與listview的background.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <stroke
        android:width="1dp"
        android:color="@color/gray" />

    <solid android:color="@color/white" />

    <corners android:radius="8dp" />

</shape>
接下來我們要實現也就是listview的第一項selector后背景的shape.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <stroke
        android:width="1dp"
        android:color="@color/gray" />

    <solid android:color="@color/gray" />

    <corners
        android:topLeftRadius="8dp"
        android:topRightRadius="8dp" />

</shape>
下面呢,我們也要實現中間的shape,以及末尾的shape等等配置.這里就不寫了.按照上面模仿就ok了.

第二種方法:我們用.9.png完全代替上面那些配置,(因為.9.png可以拉伸不毀容

所以listview的第一項,中間項,最后一項,以及就一項,我們都可以通過圖片來實現.

這里我運用第一種方法:(也鞏固下shape)

創建自定義的listview,用于實現setSelector及選中的效果.

   代碼片段:

   

package com.jj.listview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.AdapterView;
import android.widget.ListView;

/***
 * 自定義listview
 * 
 * @author Administrator
 * 
 */
public class MyListView extends ListView {
    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /****
     * 攔截觸摸事件
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            int x = (int) ev.getX();
            int y = (int) ev.getY();
            int itemnum = pointToPosition(x, y);
            if (itemnum == AdapterView.INVALID_POSITION)
                break;
            else {
                if (itemnum == 0) {
                    if (itemnum == (getAdapter().getCount() - 1)) {
                        // 只有一項
                        setSelector(R.drawable.list_round);
                    } else {
                        // 第一項
                        setSelector(R.drawable.list_top_round);
                    }
                } else if (itemnum == (getAdapter().getCount() - 1))
                    // 最后一項
                    setSelector(R.drawable.list_bottom_round);
                else {
                    // 中間項
                    setSelector(R.drawable.list_center_round);
                }
            }
            break;
        case MotionEvent.ACTION_UP:
            break;
        }
        return super.onInterceptTouchEvent(ev);
    }
}
這段代碼網上很多,幾乎全部都是這么實現的,這里我簡單介紹,如果說錯了,請大家指出,

首先我們是實現了onInterceptTouchEvent這個方法,在這里我們也可以用onTouchEvent事件,都可以實現我們想要的效果.

onInterceptTouchEvent和onTouchEvent的區別:簡單的來說前者可以攔截后者.

詳細的請大家參考http://blog.csdn.net/ddna/article/details/5473293  強烈建議大家看看.

下面一些邏輯雖說沒有見過,我想大家都看得懂,(就是獲取坐標(x,y),然后根據坐標獲取listview相應的position值,沒有返回-1,然后根據相應的position設置相應的setSelector ).有時間得好好研究下listview.對靈活運用很有幫助.


在這里我還要在說名一點,上面那個圖形很顯然不是一個listview,是三個listview,另外重要的是我們一個屏幕顯示不完全,這時我們就用到了ScrollView,一提到這個我想大家都知道ScrollView和listview是冤家,不可能同時存在,不過網上有解決辦法,原理就是我們動態show 我們的listview,

實現方法:

/***
     * 動態設置listview的高度
     * 
     * @param listView
     */
    public void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            return;
        }
        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight
                + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        // params.height += 5;// if without this statement,the listview will be
        // a
        // little short
        // listView.getDividerHeight()獲取子項間分隔符占用的高度
        // params.height最后得到整個ListView完整顯示需要的高度
        listView.setLayoutParams(params);
    }
我們在Listview的setAdapter后,在調用下這個方法就OK了,代碼內容,我想大家都看的明白,就不多介紹了.

效果圖:

Android ListView實現圓角      Android ListView實現圓角     Android ListView實現圓角

樣子雖丑陋了點,但是實現效果就行了,如果在項目中就另當別論了。


轉自:http://blog.csdn.net/jj120522/article/details/7944484

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!