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>