Android 圆角ListView

网络方法摘抄:

方法一: 定义

<?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. }
   第五种方法最好
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值