Android 圓角ListView

jopen 12年前發布 | 35K 次閱讀 Android Android開發 移動開發

d1.jpg

方法一:定義

<?xml version ="1.0" encoding ="UTF-8" ?> 
<shape xmlns:android ="http://schemas.android.com/apk/res/android&quot; android:shape ="rectangle" > 
       <gradient android:startColor ="#B0BCCD" android:endColor ="#6D84A2" android:angle ="270" /> 
       <corners android:bottomRightRadius ="8dp" android:bottomLeftRadius ="8dp" android:topLeftRadius ="8dp" 
              android:topRightRadius ="8dp" />

</shape> </pre>

布局文件中的ListView屬性android:listSelector="@drawable/shape"

存在問題是,ListView最上面或者最下面的item選中時,圓角背景變成直角的

方法二:修改選中item 

public class RoundedRectListView extends ListView {
private Context mContext; public RoundedRectListView( Context context) { super ( context) ;
this .mContext = context; init( ) ; } public RoundedRectListView( Context context, AttributeSet attrs) { super ( context, attrs) ; this .mContext = context; init( ) ; } public RoundedRectListView( Context context, AttributeSet attrs, int defStyle) { super ( context, attrs, defStyle) ; this .mContext = context; init( ) ; } protected void init( ) { setBackgroundDrawable( mContext.getResources ( ) .getDrawable ( R.drawable .background_rounded_white ) ) ; setCacheColorHint( Color .WHITE ) ; setFooterDividersEnabled( false ) ; } @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 .listview_selection_shade_rounded ) ; 
                                    else 
                                            setSelector( R.drawable .listview_selection_shade_top_rounded ) ; 
                            } 
                            else if ( itemnum== ( getAdapter( ) .getCount ( ) - 1) ) 
                                    setSelector( R.drawable .listview_selection_shade_bottom_rounded ) ; 
                            else 
                                    setSelector( R.drawable .listview_selection_shade ) ;                       
                    } 
                    break ; 
            case MotionEvent.ACTION_UP : 
                    break ; 
            } 
            return true ;     
    }       

} </pre>

方法三:定義selector

public class RoundedRectListView extends ListView {
private Context mContext;

    public RoundedRectListView( Context context) { 
            super ( context) ;         
            this .mContext = context; 
            init( ) ; 
    } 
    public RoundedRectListView( Context context, AttributeSet attrs) { 
            super ( context, attrs) ; 
            this .mContext = context; 
            init( ) ; 
    } 
    public RoundedRectListView( Context context, AttributeSet attrs, int defStyle) { 
            super ( context, attrs, defStyle) ; 
            this .mContext = context; 
            init( ) ; 
    } 
    protected void init( ) { 
            setBackgroundDrawable( mContext.getResources ( ) .getDrawable ( R.drawable .background_rounded_white ) ) ; 
            setCacheColorHint( Color .WHITE ) ; 
            setFooterDividersEnabled( false ) ; 
    } 
    @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 .listview_selection_shade_rounded ) ; 
                                    else 
                                            setSelector( R.drawable .listview_selection_shade_top_rounded ) ; 
                            } 
                            else if ( itemnum== ( getAdapter( ) .getCount ( ) - 1) ) 
                                    setSelector( R.drawable .listview_selection_shade_bottom_rounded ) ; 
                            else 
                                    setSelector( R.drawable .listview_selection_shade ) ;                       
                    } 
                    break ; 
            case MotionEvent.ACTION_UP : 
                    break ; 
            } 
            return true ;     
    }       

}</pre>

方法四:方法二和方法三的結合

public class RoundedRectListView extends ListView {

    private Context mContext; 

    public RoundedRectListView( Context context) { 
            super ( context) ;         
            this .mContext = context; 
            init( ) ; 
    } 
    public RoundedRectListView( Context context, AttributeSet attrs) { 
            super ( context, attrs) ; 
            this .mContext = context; 
            init( ) ; 
    } 
    public RoundedRectListView( Context context, AttributeSet attrs, int defStyle) { 
            super ( context, attrs, defStyle) ; 
            this .mContext = context; 
            init( ) ; 
    } 
   protected void init( ) { 
            setBackgroundDrawable( mContext.getResources ( ) .getDrawable ( R.drawable .background_rounded_white ) ) ; 
            setCacheColorHint( Color .WHITE ) ; 
            setFooterDividersEnabled( false ) ;         
            setSelector( new Selector( RoundedRectListView.this ,- 1) ) ; 
    } 

@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 {
setSelector( new Selector( RoundedRectListView.this ,itemnum) ) ;
} break ; case MotionEvent.ACTION_UP : break ; } return true ;
} class Selector extends Drawable { private static final String TAG = "Selector" ; private Paint mPaint; private AdapterView mList; private RectF mRectF; private int position;

    public Selector( AdapterView list,int position) { 
        mList = list; 
        mPaint = new Paint ( ) ; 
        mRectF = new RectF( ) ; 
        this .position = position 

        LinearGradient g= new LinearGradient( mRectF.top ,mRectF.left ,mRectF.right ,mRectF.bottom ,Color .parseColor ( "#058cf5" ) ,Color .parseColor ( "#015fe6" ) ,TileMode.REPEAT ) ;   

mPaint.setShader ( g) ; 
    } 
    @Override
    public void draw( Canvas canvas) { 
        Rect b = getBounds( ) ; 
        int mPosition = mList.getSelectedItemPosition ( ) ; 
        if ( mPosition==- 1) { 
            mPosition= position; 
        } 
        Log.d ( TAG, "Position :" + mPosition) ; 
        canvas.save ( ) ; 
        canvas.clipRect ( b.left , b.top , b.right , ( b.bottom + b.top ) / 2) ; 
        drawHalf( canvas, b, mPosition == 0) ; 
        canvas.restore ( ) ; 
        canvas.save ( ) ; 
        canvas.clipRect ( b.left , ( b.bottom + b.top ) / 2, b.right , b.bottom ) ; 
        drawHalf( canvas, b, mPosition == mList.getAdapter ( ) .getCount ( ) - 1 && b.bottom == mList.getHeight ( ) ) ; 
        canvas.restore ( ) ; 
        Log.d ( TAG, "draw " + b) ; 
    } 
    private void drawHalf( Canvas canvas, Rect b ,boolean round) {           

        if ( round) { 
            mRectF.set ( b) ; 
            canvas.drawRoundRect ( mRectF, 10, 10, mPaint) ;               
        } else { 
            canvas.drawRect ( b, mPaint) ;               
        } 
    } 
    @Override
    public int getOpacity( ) { 
        return 0 ; 
    } 
    @Override
    public void setAlpha( int alpha) { 
    } 
    @Override
    public void setColorFilter( ColorFilter cf) { 
    } 
} 

}</pre>

方法五:

public class RoundedRectListView extends ListView { 
    private static final float RADIUS = 16 ; 
    private Path mClip; 
    public RoundedRectListView( Context context, AttributeSet attrs) { 
        super ( context, attrs) ; 
        init( ) ; 
    } 
    private void init( ) { 
        GradientDrawable gd = new GradientDrawable( ) ; 
        gd.setCornerRadius ( RADIUS) ; 
        gd.setColor ( 0xff208020) ; 
        setBackgroundDrawable( gd) ; 
        setCacheColorHint( 0) ; 
        setVerticalFadingEdgeEnabled( false ) ; 
        StateListDrawable sld = new StateListDrawable( ) ; 
        sld.addState ( 
                PRESSED_ENABLED_STATE_SET, 
                new GradientDrawable( Orientation.LEFT_RIGHT , new int [ ] { 0xffa58cf5, 0xffa13f99} ) ) ; 
        sld.addState ( 
                EMPTY_STATE_SET,
                new GradientDrawable( Orientation.LEFT_RIGHT , new int [ ] { 0xff058cf5, 0xff013f99} ) ) ; 
        setSelector( sld) ; 
    } 
    @Override
    protected void onSizeChanged( int w, int h, int oldw, int oldh) { 
        super .onSizeChanged ( w, h, oldw, oldh) ; 
        mClip = new Path( ) ; 
        RectF rect = new RectF( 0, 0, w, h) ; 
        mClip.addRoundRect ( rect, RADIUS, RADIUS, Direction.CW ) ; 
    } 
   @Override
    protected void dispatchDraw( Canvas canvas) { 
        canvas.save ( ) ; 
        canvas.clipPath ( mClip) ; 
        super .dispatchDraw ( canvas) ; 
        canvas.restore ( ) ; 
    } 
}

第五種方法最好

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