android ListView实现圆角

本文介绍了解决Android中ListView项选中状态时顶部和底部圆角丢失的问题,提供了五种不同的实现方法,包括自定义ListView、使用不同选择器资源及自定义绘制等技术手段。

d1.jpg

方法一:定义

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

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

存在问题是,ListView最上面或者最下面的item选中时,圆角背景变成直角的

方法二:修改选中item 

01public class RoundedRectListView extends ListView {   
02        private Context mContext; 
03        public RoundedRectListView( Context context) { 
04                super ( context) ;         
05                this .mContext = context; 
06                init( ) ; 
07        
08        public RoundedRectListView( Context context, AttributeSet attrs) { 
09                super ( context, attrs) ; 
10                this .mContext = context; 
11                init( ) ; 
12        
13        public RoundedRectListView( Context context, AttributeSet attrs, int defStyle) { 
14                super ( context, attrs, defStyle) ; 
15                this .mContext = context; 
16                init( ) ; 
17        
18        protected void init( ) { 
19                setBackgroundDrawable( mContext.getResources ( ) .getDrawable ( R.drawable .background_rounded_white ) ) ; 
20                setCacheColorHint( Color .WHITE ) ; 
21                setFooterDividersEnabled( false ) ; 
22        
23        @Override
24        public boolean onInterceptTouchEvent( MotionEvent ev) { 
25   
26                switch ( ev.getAction ( ) ) { 
27                case MotionEvent.ACTION_DOWN : 
28                        int x = ( int ) ev.getX ( ) ; 
29                        int y = ( int ) ev.getY ( ) ; 
30                        int itemnum = pointToPosition( x, y) ; 
31                        if ( itemnum == AdapterView.INVALID_POSITION ) 
32                                break ;                   
33                        else 
34                        {  
35                                if ( itemnum== 0) { 
36                                        if ( itemnum== ( getAdapter( ) .getCount ( ) - 1) ) 
37                                                setSelector( R.drawable .listview_selection_shade_rounded ) ; 
38                                        else 
39                                                setSelector( R.drawable .listview_selection_shade_top_rounded ) ; 
40                                
41                                else if ( itemnum== ( getAdapter( ) .getCount ( ) - 1) ) 
42                                        setSelector( R.drawable .listview_selection_shade_bottom_rounded ) ; 
43                                else 
44                                        setSelector( R.drawable .listview_selection_shade ) ;                       
45                        
46                        break
47                case MotionEvent.ACTION_UP : 
48                        break
49                
50                return true ;     
51        }       
52}

方法三:定义selector

01public class RoundedRectListView extends ListView {     
02        private Context mContext; 
03   
04        public RoundedRectListView( Context context) { 
05                super ( context) ;         
06                this .mContext = context; 
07                init( ) ; 
08        
09        public RoundedRectListView( Context context, AttributeSet attrs) { 
10                super ( context, attrs) ; 
11                this .mContext = context; 
12                init( ) ; 
13        
14        public RoundedRectListView( Context context, AttributeSet attrs, int defStyle) { 
15                super ( context, attrs, defStyle) ; 
16                this .mContext = context; 
17                init( ) ; 
18        
19        protected void init( ) { 
20                setBackgroundDrawable( mContext.getResources ( ) .getDrawable ( R.drawable .background_rounded_white ) ) ; 
21                setCacheColorHint( Color .WHITE ) ; 
22                setFooterDividersEnabled( false ) ; 
23        
24        @Override
25        public boolean onInterceptTouchEvent( MotionEvent ev) { 
26   
27                switch ( ev.getAction ( ) ) { 
28                case MotionEvent.ACTION_DOWN : 
29                        int x = ( int ) ev.getX ( ) ; 
30                        int y = ( int ) ev.getY ( ) ; 
31                        int itemnum = pointToPosition( x, y) ; 
32   
33                        if ( itemnum == AdapterView.INVALID_POSITION ) 
34                                break ;                   
35                        else 
36                        {  
37                                if ( itemnum== 0) { 
38                                        if ( itemnum== ( getAdapter( ) .getCount ( ) - 1) ) 
39                                                setSelector( R.drawable .listview_selection_shade_rounded ) ; 
40                                        else 
41                                                setSelector( R.drawable .listview_selection_shade_top_rounded ) ; 
42                                
43                                else if ( itemnum== ( getAdapter( ) .getCount ( ) - 1) ) 
44                                        setSelector( R.drawable .listview_selection_shade_bottom_rounded ) ; 
45                                else 
46                                        setSelector( R.drawable .listview_selection_shade ) ;                       
47                        
48                        break
49                case MotionEvent.ACTION_UP : 
50                        break
51                
52                return true ;     
53        }       
54}

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

001public class RoundedRectListView extends ListView {   
002  
003        private Context mContext; 
004   
005        public RoundedRectListView( Context context) { 
006                super ( context) ;         
007                this .mContext = context; 
008                init( ) ; 
009        
010        public RoundedRectListView( Context context, AttributeSet attrs) { 
011                super ( context, attrs) ; 
012                this .mContext = context; 
013                init( ) ; 
014        
015        public RoundedRectListView( Context context, AttributeSet attrs, int defStyle) { 
016                super ( context, attrs, defStyle) ; 
017                this .mContext = context; 
018                init( ) ; 
019        
020       protected void init( ) { 
021                setBackgroundDrawable( mContext.getResources ( ) .getDrawable ( R.drawable .background_rounded_white ) ) ; 
022                setCacheColorHint( Color .WHITE ) ; 
023                setFooterDividersEnabled( false ) ;         
024                setSelector( new Selector( RoundedRectListView.this ,- 1) ) ; 
025        
026   @Override
027        public boolean onInterceptTouchEvent( MotionEvent ev) { 
028                switch ( ev.getAction ( ) ) { 
029                case MotionEvent.ACTION_DOWN : 
030                        int x = ( int ) ev.getX ( ) ; 
031                        int y = ( int ) ev.getY ( ) ; 
032                        int itemnum = pointToPosition( x, y) ; 
033                        if ( itemnum == AdapterView.INVALID_POSITION ) 
034                                break ;                   
035                        else 
036                        {               
037                           setSelector( new Selector( RoundedRectListView.this ,itemnum) ) ;                 
038                        
039                        break
040                case MotionEvent.ACTION_UP : 
041                        break
042                
043                return true ;     
044        
045    class Selector extends Drawable { 
046        private static final String TAG = "Selector"
047        private Paint mPaint; 
048        private AdapterView mList; 
049        private RectF mRectF; 
050        private int position; 
051          
052        public Selector( AdapterView list,int position) { 
053            mList = list; 
054            mPaint = new Paint ( ) ; 
055            mRectF = new RectF( ) ; 
056            this .position = position 
057  
058            LinearGradient g= new LinearGradient( mRectF.top ,mRectF.left ,mRectF.right ,mRectF.bottom ,Color .parseColor ( "#058cf5" ) ,Color .parseColor ( "#015fe6" ) ,TileMode.REPEAT ) ;   
059  
060    mPaint.setShader ( g) ; 
061        
062        @Override
063        public void draw( Canvas canvas) { 
064            Rect b = getBounds( ) ; 
065            int mPosition = mList.getSelectedItemPosition ( ) ; 
066            if ( mPosition==- 1) { 
067                mPosition= position; 
068            
069            Log.d ( TAG, "Position :" + mPosition) ; 
070            canvas.save ( ) ; 
071            canvas.clipRect ( b.left , b.top , b.right , ( b.bottom + b.top ) / 2) ; 
072            drawHalf( canvas, b, mPosition == 0) ; 
073            canvas.restore ( ) ; 
074            canvas.save ( ) ; 
075            canvas.clipRect ( b.left , ( b.bottom + b.top ) / 2, b.right , b.bottom ) ; 
076            drawHalf( canvas, b, mPosition == mList.getAdapter ( ) .getCount ( ) - 1 && b.bottom == mList.getHeight ( ) ) ; 
077            canvas.restore ( ) ; 
078            Log.d ( TAG, "draw " + b) ; 
079        
080        private void drawHalf( Canvas canvas, Rect b ,boolean round) {           
081                  
082            if ( round) { 
083                mRectF.set ( b) ; 
084                canvas.drawRoundRect ( mRectF, 10, 10, mPaint) ;               
085            } else
086                canvas.drawRect ( b, mPaint) ;               
087            
088        
089        @Override
090        public int getOpacity( ) { 
091            return 0
092        
093        @Override
094        public void setAlpha( int alpha) { 
095        
096        @Override
097        public void setColorFilter( ColorFilter cf) { 
098        
099    
100}

方法五:

01public class RoundedRectListView extends ListView { 
02    private static final float RADIUS = 16
03    private Path mClip; 
04    public RoundedRectListView( Context context, AttributeSet attrs) { 
05        super ( context, attrs) ; 
06        init( ) ; 
07    
08    private void init( ) { 
09        GradientDrawable gd = new GradientDrawable( ) ; 
10        gd.setCornerRadius ( RADIUS) ; 
11        gd.setColor ( 0xff208020) ; 
12        setBackgroundDrawable( gd) ; 
13        setCacheColorHint( 0) ; 
14        setVerticalFadingEdgeEnabled( false ) ; 
15        StateListDrawable sld = new StateListDrawable( ) ; 
16        sld.addState ( 
17                PRESSED_ENABLED_STATE_SET, 
18                new GradientDrawable( Orientation.LEFT_RIGHT , new int [ ] { 0xffa58cf5, 0xffa13f99} ) ) ; 
19        sld.addState ( 
20                EMPTY_STATE_SET,
21                new GradientDrawable( Orientation.LEFT_RIGHT , new int [ ] { 0xff058cf5, 0xff013f99} ) ) ; 
22        setSelector( sld) ; 
23    
24    @Override
25    protected void onSizeChanged( int w, int h, int oldw, int oldh) { 
26        super .onSizeChanged ( w, h, oldw, oldh) ; 
27        mClip = new Path( ) ; 
28        RectF rect = new RectF( 0, 0, w, h) ; 
29        mClip.addRoundRect ( rect, RADIUS, RADIUS, Direction.CW ) ; 
30    
31   @Override
32    protected void dispatchDraw( Canvas canvas) { 
33        canvas.save ( ) ; 
34        canvas.clipPath ( mClip) ; 
35        super .dispatchDraw ( canvas) ; 
36        canvas.restore ( ) ; 
37    
38}

第五种方法最好 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值