Android ListView實現圓角


首先呢,我們還是看幾個示圖:

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實現圓角

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM