Android 圆角ListView

本文提供多种解决ListView选中项顶部或底部圆角丢失的方法,包括自定义ListView、使用selector状态资源以及绘制圆角背景等方案。

网络方法摘抄:

方法一: 定义

<?xml version ="1.0" encoding ="UTF-8" ?>

<shape xmlns:android ="http://schemas.android.com/apk/res/android" 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>
布局文件中的ListView属性android:listSelector="@drawable/shape"

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

方法二:修改选中item 

  1. public class RoundedRectListView extends ListView {  
  2.         private Context mContext;
  3.         public RoundedRectListView( Context context) {
  4.                 super ( context) ;        
  5.                 this .mContext = context;
  6.                 init( ) ;
  7.         }
  8.         public RoundedRectListView( Context context, AttributeSet attrs) {
  9.                 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

  1. public class RoundedRectListView extends ListView {    
  2.         private Context mContext;
  3.  
  4.         public RoundedRectListView( Context context) {
  5.                 super ( context) ;        
  6.                 this .mContext = context;
  7.                 init( ) ;
  8.         }
  9.         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. }

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

  1.  
  2. public class RoundedRectListView extends ListView {  
  3.         private Context mContext;
  4.  
  5.         public RoundedRectListView( Context context) {
  6.                 super ( context) ;        
  7.                 this .mContext = context;
  8.                 init( ) ;
  9.         }
  10.         public RoundedRectListView( Context context, AttributeSet attrs) {
  11.                 super ( context, attrs) ;
  12.                 this .mContext = context;
  13.                 init( ) ;
  14.         }
  15.         public RoundedRectListView( Context context, AttributeSet attrs, int defStyle) {
  16.                 super ( context, attrs, defStyle) ;
  17.                 this .mContext = context;
  18.                 init( ) ;
  19.         }
  20.        protected void init( ) {
  21.                 setBackgroundDrawable( mContext.getResources ( ) .getDrawable ( R.drawable .background_rounded_white ) ) ;
  22.                 setCacheColorHint( Color .WHITE ) ;
  23.                 setFooterDividersEnabled( false ) ;        
  24.                 setSelector( new Selector( RoundedRectListView.this ,- 1) ) ;
  25.         }
  26.    @Override
  27.         public boolean onInterceptTouchEvent( MotionEvent ev) {
  28.                 switch ( ev.getAction ( ) ) {
  29.                 case MotionEvent.ACTION_DOWN :
  30.                         int x = ( int ) ev.getX ( ) ;
  31.                         int y = ( int ) ev.getY ( ) ;
  32.                         int itemnum = pointToPosition( x, y) ;
  33.                         if ( itemnum == AdapterView.INVALID_POSITION )
  34.                                 break ;                  
  35.                         else
  36.                         {              
  37.                            setSelector( new Selector( RoundedRectListView.this ,itemnum) ) ;                
  38.                         }
  39.                         break ;
  40.                 case MotionEvent.ACTION_UP :
  41.                         break ;
  42.                 }
  43.                 return true ;    
  44.         }
  45.     class Selector extends Drawable {
  46.         private static final String TAG = "Selector" ;
  47.         private Paint mPaint;
  48.         private AdapterView mList;
  49.         private RectF mRectF;
  50.         private int position;
  51.        
  52.         public Selector( AdapterView list,int position) {
  53.             mList = list;
  54.             mPaint = new Paint ( ) ;
  55.             mRectF = new RectF( ) ;
  56.             this .position = position
  57.             LinearGradient g= new LinearGradient( mRectF.top ,mRectF.left ,mRectF.right ,mRectF.bottom ,Color .parseColor ( "#058cf5" ) ,Color .parseColor ( "#015fe6" ) ,TileMode.REPEAT ) ;  
  58.     mPaint.setShader ( g) ;
  59.         }
  60.         @Override
  61.         public void draw( Canvas canvas) {
  62.             Rect b = getBounds( ) ;
  63.             int mPosition = mList.getSelectedItemPosition ( ) ;
  64.             if ( mPosition==- 1) {
  65.                 mPosition= position;
  66.             }
  67.             Log.d ( TAG, "Position :" + mPosition) ;
  68.             canvas.save ( ) ;
  69.             canvas.clipRect ( b.left , b.top , b.right , ( b.bottom + b.top ) / 2) ;
  70.             drawHalf( canvas, b, mPosition == 0) ;
  71.             canvas.restore ( ) ;
  72.             canvas.save ( ) ;
  73.             canvas.clipRect ( b.left , ( b.bottom + b.top ) / 2, b.right , b.bottom ) ;
  74.             drawHalf( canvas, b, mPosition == mList.getAdapter ( ) .getCount ( ) - 1 && b.bottom == mList.getHeight ( ) ) ;
  75.             canvas.restore ( ) ;
  76.             Log.d ( TAG, "draw " + b) ;
  77.         }
  78.         private void drawHalf( Canvas canvas, Rect b ,boolean round) {          
  79.                
  80.             if ( round) {
  81.                 mRectF.set ( b) ;
  82.                 canvas.drawRoundRect ( mRectF, 10, 10, mPaint) ;              
  83.             } else {
  84.                 canvas.drawRect ( b, mPaint) ;              
  85.             }
  86.         }
  87.         @Override
  88.         public int getOpacity( ) {
  89.             return 0 ;
  90.         }
  91.         @Override
  92.         public void setAlpha( int alpha) {
  93.         }
  94.         @Override
  95.         public void setColorFilter( ColorFilter cf) {
  96.         }
  97.     }
  98. }

方法五:

  1. public class RoundedRectListView extends ListView {
  2.     private static final float RADIUS = 16 ;
  3.     private Path mClip;
  4.     public RoundedRectListView( Context context, AttributeSet attrs) {
  5.         super ( context, attrs) ;
  6.         init( ) ;
  7.     }
  8.     private void init( ) {
  9.         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. }
   第五种方法最好
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值