网络方法摘抄:
方法一: 定义
<?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
- 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 ;
-
}
-
}
方法三:定义selector
-
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 ;
-
}
-
}
方法四:方法二和方法三的结合
-
-
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 ) {
-
}
-
}
-
}
方法五:
-
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 ( ) ;
-
}
-
}