Android 圆角ListView

jopen 13年前
     <p><img title="d1.jpg" border="0" alt="d1.jpg" src="https://simg.open-open.com/show/38a69c5a0970264820f33b9a8047499d.jpg" width="321" height="478" /></p>    <strong>方法一:定义</strong>    <p></p>    <pre class="brush:xml; toolbar: true; auto-links: false;"><?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> </pre>    <p></p>    <p>布局文件中的ListView属性android:listSelector="@drawable/shape"</p>    <p>存在问题是,ListView最上面或者最下面的item选中时,圆角背景变成直角的</p>    <p><strong>方法二:修改选中item  </strong></p>    <p></p>    <pre class="brush:java; toolbar: true; auto-links: false;">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>    <p></p>    <p>方法三:定义selector</p>    <pre class="brush:java; toolbar: true; auto-links: false;">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>    <p></p>    <p>方法四:方法二和方法三的结合</p>    <pre class="brush:java; toolbar: true; auto-links: false;">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>    <p></p>    <p>方法五:</p>    <pre class="brush:java; toolbar: true; auto-links: false;">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 ( ) ;      }  }</pre>    <p></p>    <div class="java">     第五种方法最好    </div>