Android 圆角ListView
方法一:定义
<?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的更多相关文章
- android自定义listview实现圆角
在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种 ...
- Android学习系列(17)--App列表之圆角ListView(续)
http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)- ...
- android:shape的使用(+圆角ListView)(转)
http://dev.10086.cn/cmdn/wiki/index.php?doc-view-6087.html Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape ...
- Android学习系列(16)--App列表之圆角ListView
有些东西看多了,就厌烦了:extjs对我这种感觉最为强烈.甚至,有时觉得设计之殇是审美疲劳.直角看多了,就想看看圆角,不知何时,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,iphone中 ...
- android中listView下拉刷新
Android的ListView是应用最广的一个组件,功能强大,扩展性灵活(不局限于ListView本身一个类),前面的文章有介绍分组,拖拽,3D立体,游标,圆角,而今天我们要介绍的是另外一个扩展Li ...
- Android—万能ListView适配器
ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...
- Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)
昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...
- Android之ListView性能优化——一行代码绑定数据——万能适配器
如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...
- Android中ListView的几种常见的优化方法
Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...
随机推荐
- ReactNavtive框架教程(4)
开头的响应码, 这些代码都很实用. 比如202 和 200表示返回一个推荐位置的列表.当完毕这个实例后.你能够尝试处理这些返回码.并将列表提供给用户选择. 保存,返回模拟器,按下Cmd+R ,然后搜索 ...
- 从 QSplitter 中移除 QWidget(使用隐藏与显示,切换十分方便,不要真正销毁)
Splitter 的函数中有addWidget,但是却没有removeWidget, 或者delete之类的功能,所以如果想删去或者暂时不显示其中的某些widget就要自己手动完成这个效果.方法一:取 ...
- wordpress 加速主题的静态资源
wordpress 加速主题的静态资源(固定的CSS.JS和图片等) wordpress 中用函数 get_stylesheet_directory_uri() 生成当前主题的 URL , 格式如 h ...
- Rpm另类用法加固Linux安全
Rpm另类用法加固Linux安全 RPM是Red Hat Package Manager的缩写即Red Hat软件管理器.它是一个开放的包管理软件,由Red Hat公司所开发和维护,可以在Red ...
- linux监测tomcat服务
原文链接:https://blog.csdn.net/qq_37936542/article/details/81086928 项目上线之后,tomcat服务器有时候会莫名其妙的挂掉,利用shell写 ...
- CISP/CISA 每日一题 二
CISA 观察和测试用户操作程序 1.职责分离:确保没人具有执行多于一个下列处理过程的能力:启动.授权.验证或分发 2.输入授权:可以通过在输入文件上的书面授权或唯一口令的使用来获得证据 3.平衡:验 ...
- 如何在同一台机器上安装多个MySQL的实例(转)
最近由于工作的需要,需要在同一台机器上搭建两个MySQL的实例,(注:已经存在了一个3306的MySQL的实例). 先说下,什么是mysql的多实例,简单的来说就是一台机器上安装了多个mysql的服务 ...
- item-设置可见性
如果我们想要设置menu中item的可见行,有两种方式: 1.直接在menu的xml代码中设置 <menu> <item android:id="@+id/action_h ...
- 91.生成ini文件并写入和读取ini文件
写入 WritePrivateProfileStringA("hello money", infx[i].name, money, "1.ini"); 按照字符 ...
- css的三种表现形式
1.行内样式(内嵌样式):结构的内部,即写在标签内的样式:写在标签的开始部分内部,style属性当中:<标记 style="样式的属性名1:样式的属性值1:属性名2:属性值2:.... ...