方法一:定义

<?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. poj2796

    #include <cstdio> /* * source poj.2796 * 题目: * 给定一个非负数的数组 其中value[l,r] = sum(l,r) * min (l,r); ...

  2. shiro session管理

    http://shiro.apache.org/session-management.html Using Sessions The SessionManager Session Timeout Pe ...

  3. qtcreator配置

    如果是做嵌入式开发,那么宿主机使用的交叉编译的QT版本是必须和目标板上使用的qt版本一致的. 而且在路径上,如果qt使用的库如果不是放在目标板默认的连接库路径的话, 那么目标板qt程序就会到配置编译Q ...

  4. (转)Linux下查看Nginx Apache MySQL的并发连接数和连接状态

    转自: http://www.ha97.com/4106.html 1.查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态:netstat -n | awk '/^tcp/ { ...

  5. 洛谷 P1755 斐波那契的拆分

    P1755 斐波那契的拆分 题目背景 无 题目描述 已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出n的拆分方法 输入输出格式 输入格式: 一个数t,表示有t组数据 接下来t行,每行一个 ...

  6. 词向量 word2vec

    看的这一篇的笔记 http://licstar.net/archives/328 看不太懂. 要学的话,看这里吧,这里把一些资料做了整合: http://www.cnblogs.com/wuzhitj ...

  7. graphicview和widgets没本质区别。它只是更轻量级,更灵活,性能更高的widgets

    graphicview和widgets没本质区别.它只是更轻量级,更灵活,性能更高的widgets.核心就是把widgets变成了更轻量级的graphicitem,把QWidget的各种事件转换成了g ...

  8. react取消监听scroll事件

    如果要移除事件addEventListener的执行函数必须使用外部函数而不能直接使用匿名函数 错误写法: // 这样写是移除不了滚动事件的 componentDidMount() { // 添加滚动 ...

  9. Docker---(4)Docker 部署spring web项目

    原文:Docker---(4)Docker 部署spring web项目 版权声明:欢迎转载,请标明出处,如有问题,欢迎指正!谢谢!微信:w1186355422 https://blog.csdn.n ...

  10. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载.   ...