方法一:定义

<?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 ="" />
<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== ) {
if ( itemnum== ( getAdapter( ) .getCount ( ) - ) )
setSelector( R.drawable .listview_selection_shade_rounded ) ;
else
setSelector( R.drawable .listview_selection_shade_top_rounded ) ;
}
else if ( itemnum== ( getAdapter( ) .getCount ( ) - ) )
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== ) {
if ( itemnum== ( getAdapter( ) .getCount ( ) - ) )
setSelector( R.drawable .listview_selection_shade_rounded ) ;
else
setSelector( R.drawable .listview_selection_shade_top_rounded ) ;
}
else if ( itemnum== ( getAdapter( ) .getCount ( ) - ) )
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 ,- ) ) ;
}
@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==- ) {
mPosition= position;
}
Log.d ( TAG, "Position :" + mPosition) ;
canvas.save ( ) ;
canvas.clipRect ( b.left , b.top , b.right , ( b.bottom + b.top ) / ) ;
drawHalf( canvas, b, mPosition == ) ;
canvas.restore ( ) ;
canvas.save ( ) ;
canvas.clipRect ( b.left , ( b.bottom + b.top ) / , b.right , b.bottom ) ;
drawHalf( canvas, b, mPosition == mList.getAdapter ( ) .getCount ( ) - && 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, , , mPaint) ;
} else {
canvas.drawRect ( b, mPaint) ;
}
}
@Override
public int getOpacity( ) {
return ;
}
@Override
public void setAlpha( int alpha) {
}
@Override
public void setColorFilter( ColorFilter cf) {
}
}
}

方法五:

public class RoundedRectListView extends ListView {
private static final float RADIUS = ;
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( ) ;
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( , , 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 ( ) ;
}
}

第五种方法最好

Android 圆角ListView的更多相关文章

  1. android自定义listview实现圆角

    在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种 ...

  2. Android学习系列(17)--App列表之圆角ListView(续)

    http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html   本来这篇文章想并到上篇Android学习系列(16)- ...

  3. android:shape的使用(+圆角ListView)(转)

    http://dev.10086.cn/cmdn/wiki/index.php?doc-view-6087.html Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape ...

  4. Android学习系列(16)--App列表之圆角ListView

    有些东西看多了,就厌烦了:extjs对我这种感觉最为强烈.甚至,有时觉得设计之殇是审美疲劳.直角看多了,就想看看圆角,不知何时,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,iphone中 ...

  5. android中listView下拉刷新

    Android的ListView是应用最广的一个组件,功能强大,扩展性灵活(不局限于ListView本身一个类),前面的文章有介绍分组,拖拽,3D立体,游标,圆角,而今天我们要介绍的是另外一个扩展Li ...

  6. Android—万能ListView适配器

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...

  7. Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)

    昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...

  8. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  9. Android中ListView的几种常见的优化方法

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...

随机推荐

  1. 【Android】利用安卓的数据接口、多媒体处理编写内存卡Mp3播放器app

    通过调用安卓的MediaPlayer能够直接完毕Mp3等主流音频的播放,同一时候利用ContentResolver与Cursor能够直接读取安卓内在数据库的信息.直接获取当前sdcard中全部音频的列 ...

  2. postgresql 查看单个表大小

    3中方法,不论什么一个都行 方法一 ,查一个表 select pg_size_pretty(pg_relation_size('table_name')); 方法二 ,查出全部表并按大小排序 SELE ...

  3. WIN8.1 上安装 debian8.7 遇到的问题及解决方法

    WIN8.1 上安装 debian8.7 遇到的问题及解决方法 参照百度经验 <win7下硬盘安装debian7> ( http://jingyan.baidu.com/article/8 ...

  4. js24---工厂模式2

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  5. itchat转发指定的微信群里某个用户的发言到指定的群

    复读机功能, 如果有比较多的用户,超出500人,那就得分开至少两个群,如何把一些消息自动复制到另一个群呢. 自动转发指定用户的发言,转发到别的群 # !/usr/bin/env python # -* ...

  6. vmware workstation安装windows server 2019

    提示需要输入密钥,选择[我没有密钥] 选择有桌面体验的 自定义 新建C盘 100G 选择100G的主分区,下一步 PS:未分配的空间,先不理,安装完系统,进桌面,再分配 开始安装.接下来就是等. 等. ...

  7. 六、Docker+Gitlab

    原文:六.Docker+Gitlab (1)下载镜像: docker pull gitlab/gitlab-ce (2)运行镜像: GITLAB_HOME=`pwd`/data/gitlab dock ...

  8. CListCtrl 隔行变色

    响应消息 ON_NOTIFY(NM_CUSTOMDRAW, ListCtrl的ID, OnNMCustomdrawList) 实现函数OnNMCustomdrawList void CFinishWe ...

  9. 想知道WiFi是什么样子的么?

    据英国<每日邮报>报道.英国纽卡斯尔大学博士生路易斯·赫南日前利用定制的仪器为WiFi信号拍照,绘制出一系列展现人类周围无形网络WiFi连接情况的图,这些盘旋环绕的明亮光束,宛如幽灵一般缠 ...

  10. Scala入门到精通——第二十二节 高级类型 (一)

    作者:摇摆少年梦 视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 this.type使用 类型投影 结构类型 复合类型 1. this.type使用 c ...