android 边框圆角

摘要:
角是指圆角。注意,bottomRightRadius是左下角而不是右下角,bottomLeftRadius是右下角。˃˃LinearLayoutxmlns:android=“http://schemas.android.com/apk/res/android“android:orientation=”vertical“android:layout_width=”fill_parent“android:layout_height=”fill_parent“android:background=”#FFFFFF“˃效果图如下:2.1基本圆角和边框Android除了支持原始图像资源之外,更好的是它可以使用XML文件定义一些简单的图形。这有点像web CSS,但与CSS3相比,Android的XML实现并没有那么强大,例如,边框是围绕着还是不围绕着声音。--shape如果不声明形状,默认值为正方形--˃˃˂!

设置边框圆角可以在drawable目录里定义一个xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">    
  3.     <solid android:color="#000000" />    
  4.     <corners android:topLeftRadius="10dp"   
  5.             android:topRightRadius="10dp"    
  6.             android:bottomRightRadius="10dp"   
  7.             android:bottomLeftRadius="10dp"/>    
  8. </shape>    

解释: solid的表示填充颜色,为了简单,这里用的是黑色。

          而corners则是表示圆角,注意的是这里bottomRightRadius是左下角而不是右下角,bottomLeftRadius右下角。

当然上面的效果也可以像下面一样设置,如下:

[c-sharp] view plaincopy
  1. <corners android:radius="5dp" />   

 

如果想引用这个xml,只需要@drawable/corners_bg.xml即可

  1. android:background="@drawable/corners_bg"    

 

具体步骤如下:

第一步:

在drawable里面定义一个名为corners_bg.xml

/CornerDemo/res/drawable-mdpi/corners_bg.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">    
  3.     <solid android:color="#000000" />    
  4.     <corners android:topLeftRadius="10dp"   
  5.             android:topRightRadius="10dp"    
  6.             android:bottomRightRadius="10dp"   
  7.             android:bottomLeftRadius="10dp"/>    
  8. </shape>   

 

第二步:

/CornerDemo/res/layout/main.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:background="#FFFFFF"  
  7.     >  
  8.     <RelativeLayout      
  9.         android:id="@+id/login_div"    
  10.         android:layout_width="fill_parent"    
  11.         android:layout_height="150dip"    
  12.         android:padding="15dip"             
  13.         android:layout_margin="15dip"      
  14.         android:background="@drawable/corners_bg"    
  15.     >     
  16.     </RelativeLayout>    
  17.   
  18. </LinearLayout>  

 

效果图如下:

android 边框圆角第1张

2.1 基本的圆角、边框

Android除了支持原始的图片资源外,比较棒的一点就是可以用XML文件定义一些简单的图形。这有点像web的CSS,不过相比CSS3,Android的xml实现还没那么强大,例如,边框要么四周都有,要么四周都没有(我们将在后面讨论这事)。xml drawable的传送门在这里

要画一个带灰色边框和圆角的图形很容易,在drawable资源目录下添加一个xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<!-- shape如果不声明形状则默认为正方形 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners android:radius="5.0dp" />
    <!-- 圆角,你也可以对不同的角设置不同的数值 -->
    <solid android:color="#FFFFFF" />
    <!-- 形状的填充色 -->
    <stroke
        android:width="1dp"
        android:color="#CCCCCC" />
    <!-- 边框宽度和颜色 -->
</shape>

在你需要用到这东西的地方如某个View下,设置background就行了。

2.2 “自由的边框“

当前版本的Android SDK并没有给stroke提供bottom、left、right之类的属性,也就是说你无法通过它来让长方形的边框少于4条。啊,真是太遗憾了。怎么办呢?有人想到了对Layer List hack。 在StackOverflow上有不少这样的把戏

为了实现只有left,right和top边框,我们可以这么写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="rectangle" >
            <stroke
                android:width="1dp"
                android:color="@color/card_stroke" />
        </shape>
    </item>
    <item
        android:left="2dp"
        android:right="2dp"
        android:top="2dp">
        <!-- 在实际使用中我发现1dp达不到显示效果,而2dp正好可以显示边框 -->
        <shape android:shape="rectangle" >
            <solid android:color="@color/solid_white" />
        </shape>
    </item>
</layer-list>

原理差不多是这样:

android 边框圆角第2张

诡异的是理论上只要偏移量只要1dp就能显示1dp宽带边框了,但我在listview里实验了一下发现不行,换成2dp方可。有同学能解释解释么?

如果要给图形加上圆角,只需要给每个shape加上

1
2
3
<corners
  android:topLeftRadius="5.0dip"
  android:topRightRadius="5.0dip" />

值得注意的是,两个shape的radius在设置的时候请确保前面的图层不会把后面的挡住。

3 小结

要在Android中实现圆角和边框,比较简单的方法:图片、XML差不多就是这么用的啦。此外还有用Java代码调用draw方法画出来的,不过我没有研究过。 他们各有各的优点啦。用图片,能控制的东西更多,用代码修改起来比较另过。 最后要说的是两个方法的效率。在这个问题上,我留有疑问,没有做过专门的比较。但直观的感受是……好吧,没什么感受。

 

Android控件大杂烩

一直很希望能找到一个介绍各种Android UI pattern的网站,现在这里有一个。要是再完整一点,整理好一点那就更完美了。

吾记得国人做过一个iOS的,有兴趣的同学去查查。

四、带圆角的ListView

圆角流行很久了,给ListView加上圆角会很酷。例如下面这个样子。

android 边框圆角第3张

实现方法有好几种:

1. 给ListView整体设置一个带圆角的background

在XML文件里你或许会这么做

1
android:background = "@drawable/bg_list"

bg_list便是你定义的可以自适应大小的圆角图。具体做法你可以参看我的Android开发笔记——圆角和边框们

这是我们最容易想到的一种解决方案。在很多时候它能起到作用。

但是要应对上面的那种样子好像不太容易哦,怎么让scroll跑外面去?listview是占整个屏幕的宽度还是要做一个margin?

唔,想来想去,好像只能这么干。

android 边框圆角第4张

等你实际运行一下你就发现——坑爹了。这个listview的background就和一个相框一样,而不是我们想要的那种:让整个list看上去像带圆角的卡片。此外,你的scroll也不是在屏幕的边缘,而是随listview过去了。当然,你可以在listview外面加一个ScrollLayout,但请相信我,那样还是起不了什么大作用。

所以,这个解决方案适合什么情况呢? 当你需要做一个内部能滑动的带圆角的框体

2. 给ListView设置padding,给每一个条目分别设置background

我曾逆向工程Twitter for Android 想看看它们是怎么实现这样的卡片ListView的。我拿到了XML文件,我发现他们用了一个自定义的”CardView”,尼玛这得看Java源码。但反编译出来的结果甚是坑爹,我只能放弃。

后来我自己研究了一下,找了个替代方案。

基本思想是在ListView的Adapter的getView()函数里,根据position动态设置每个item的background。如,如果是第一个item,就给他一个顶部是圆角的背景。如果是当中的item,则给一个不带圆角的背景。如果是底部的item,就给一个底部带圆角的背景。

实现代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class MyAdapter extends ArrayAdapter<String> {
    // other methods...
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        View view;
        if (convertView != null) {
            view = convertView;
            holder = (ViewHolder) view.getTag();
        } else {
            view = inflater.inflate(R.layout.list_item_view, parent, false);
            holder = new ViewHolder();
            holder.source = (TextView) view.findViewById(R.id.text);
            view.setTag(holder);
        }
        // 加载要显示的数据
        holder.text.setText(getItem(position));
        // 动态设置item的background
        if (position == 0) {
            holder.layout.setBackgroundResource(R.drawable.bg_list_row_top_selector);
        } else if(position == getCount() -1){
            holder.layout.setBackgroundResource(R.drawable.bg_list_row_bottom_selector);
        }else{
            holder.layout.setBackgroundResource(R.drawable.bg_list_row_middle_selector);
        }
        return view;
    }
    private static class ViewHolder {
        RelativeLayout layout;
        TextView text;          //比如我们的item里只有一个TextView
    }
}

每个item 背景的selector,如顶部item的背景

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bg_list_row_top_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/bg_list_row_top_focused" android:state_focused="true"/>
    <item android:drawable="@drawable/bg_list_row_top_focused" android:state_selected="true"/>
    <item android:drawable="@drawable/bg_list_row_top"/>
</selector>

bg_list_row_top.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="rectangle" >
            <stroke
                android:width="1dp"
                android:color="#cccccc" />
            <corners
                android:topLeftRadius="10.0dip"
                android:topRightRadius="10.0dip" />
        </shape>
    </item>
    <item
        android:bottom="2dp"
        android:left="2dp"
        android:right="2dp"
        android:top="2dp">
        <shape android:shape="rectangle" >
            <solid android:color="#ffffff" />
            <corners
                android:topLeftRadius="8.0dip"
                android:topRightRadius="8.0dip" />
        </shape>
    </item>
</layer-list>

其他的几种状态如focused, pressed请自己脑补。

你的ListView需要占满屏幕,并且可以做如下属性设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingLeft="10.0dp"
    android:paddingRight="10.0dp"
    android:scrollbarStyle="outsideOverlay"
    android:background ="#ffe4e4e4"
    android:fadingEdge ="none"
    android:listSelector="#00000000"
    android:drawSelectorOnTop="false"
    android:cacheColorHint="#ffe4e4e4"
    android:divider="@null"
    android:dividerHeight="0.0px"
/>
<!-- 让scroll块至于list最外面 -->

五、题外话

免责声明:文章转载自《android 边框圆角》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Pandas之Dataframe叠加,排序,统计,重新设置索引asp.net 修改图片的分辨率,修改图片的长宽象素比例,修改图片的物理宽度大小下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android Studio的串口通讯开发

基于android-serialport-api实现 前言RS232标准接口UARTRS232与UART转接下载 NDK 和构建工具创建支持 C/C++ 的新项目编译C/C++代码串口通讯原理关于校验位HexString与Bytes的转换参考 前言 软件代码写久了,总会对嵌入式开发感兴趣,因为软件的东西写来写去看不见摸不着,而嵌入式硬件开发,可以捣...

状态通知栏

在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等。 下面就来说说经常会使用到通知机制中的通知栏框架(Notificaiton),它适用于交互事件的通知。它是位于顶层可以展开的通知列表。它会时不时的提醒你什么软件...

React Native之配置开发环境

安装前注意: 1)在Max OS X 10.11(El Capitan)版本中,homebrew在安装软件时可能会碰到/usr/local目录不可写的权限问题。可以使用下面的命令修复: sudo chown -R `whoami` /usr/local 2)如果命令行提示command not found,请加上sudo获得最高权限 一、环境需求 1.1...

SwitchButton 开关按钮 的多种实现方式

刚开始接触开关样式的按钮是在IOS系统上面,它的切换以及滑动十分帅气,深入人心。 所谓的开关按钮,就是只有2个状态:on和off,下图就是系统IOS 7上开关按钮效果。 起初我在android上我只会使用CheckBox去满足对应的功能。后来,查看开发文档发现,android也有了自己的原生态开关控件,并且在4.0版本中又优化加入了新的类似控件--Swi...

android自定义控件及自定义组合控件

一、构建自定义控件 构建自定义组件 Android中,你的应用程序程序与View类组件有着一种固定的联系,例如按钮(Button)、文本框(TextView),可编辑文本框(EditText),列表框(ListView),复选框(CheckBox),单选框(RadioButton),滚动条(Gallery),微调器(Spinner), 等等,还有一些比较先...

Android之MVVM开发模式

MVVM 模式简介 MVVM模式是指Model-View-ViewModel。相信看过笔者关于MVP的文章的读者也会发现,无论如何抽象化,在我们的View层中是无法避免的要处理一部分逻辑的。而MVVM模式中的View是将View的状态和行为完全抽象化,把逻辑与界面的控制完全交给ViewModel处理。 MVVM由下面三个核心组件组成: Model:用于获...