方法一:定义

<?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. 安装 VNC 和 XRDP

    安装 VNC 和 XRDPapt-get install vnc4server tightvncserver xrdp fluxbox xtermcat >vncstop.sh << ...

  2. 欧洲的VPS 1天内收到几万次ssh端口访问,99%的访问量来自中国

    欧洲的VPS 1天内收到几万次ssh端口访问,99%的访问量来自中国 前几天开了个欧洲的VPS,当备用的,没怎么用.就这样的VPS在1天之内也收到不少来自中国网民的见面礼 用了别人的一条命令: gre ...

  3. transfer learning(matlab 实现)

    一句话总结 transfer learning 的核心即是对一个已训练模型微调,使其适应新的应用,如下图示: 为 matlab 接口所训练完成的经典深度神经网络下载地址:Index of /matco ...

  4. Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)

    Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...

  5. actionbar-displayOptions 属性分析

    displayOptions 这个属性主要是控制这actionbar 上返回按钮.标题等的显示.它作为 actionBarStyle 的一个item,如下 <style name="A ...

  6. js进阶 14 jquery的ajax有哪些函数和事件(多练)

    js进阶 14 jquery的ajax有哪些函数和事件(多练) 一.总结 一句话总结:常用:load.ajax.post.get.getScript().getJSON().表单序列化,ajax事件这 ...

  7. php图像处理(thinkphp框架有相对强大的图像处理功能)

    php图像处理(thinkphp框架有相对强大的图像处理功能) 一.总结 1.php处理图像:php处理图像需要安装外库(gd库) 2.gd库函数可以非常完美的操作图像:安装好库之后,这个库里面的函数 ...

  8. amazeui学习笔记一(开始使用3)--兼容性列表compatibility

    amazeui学习笔记一(开始使用3)--兼容性列表compatibility 一.总结 1.不要用ie做前端测试,不要碰ie,尽量用google 浏览器: 按照微软官方的说法,IE 开发者工具中的浏 ...

  9. RocketMQ(九):消息发送(续)

    匠心零度 转载请注明原创出处,谢谢! RocketMQ网络部署图 NameServer:在系统中是做命名服务,更新和发现 broker服务. Broker-Master:broker 消息主机服务器. ...

  10. Android代码模拟物理、屏幕点击事件

    一.应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 private void simulateClick(View view, float x, float y) { long do ...