這裡以自定義一個可以控制圓角顯示的ImageView控制項UpRoundImageView為例,展開說明。 1、/res/values/arrrs.xml 其中declare-styleable標簽的屬性name最好是自定義控制項的類名。 標簽attr的屬性name是自定義的;format:類型值,有多 ...
這裡以自定義一個可以控制圓角顯示的ImageView控制項UpRoundImageView為例,展開說明。
1、/res/values/arrrs.xml
其中declare-styleable標簽的屬性name最好是自定義控制項的類名。
標簽attr的屬性name是自定義的;format:類型值,有多種可選,並且可以指定多種類型值,將在後面進行詳細說明。
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="UpRoundImageView"> <attr name="leftup_radius_l" format="float"/> <attr name="leftup_radius_r" format="float"/> <attr name="rightup_radius_l" format="float"/> <attr name="rightup_radius_r" format="float"/> <attr name="rightdown_radius_l" format="float"/> <attr name="rightdown_radius_r" format="float"/> <attr name="leftdown_radius_l" format="float"/> <attr name="leftdown_radius_r" format="float"/> </declare-styleable> </resources>
2、UpRoundImageView:
package com.example.qyn.projectqyn.customviews; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Path; import android.graphics.RectF; import android.util.AttributeSet; import android.widget.ImageView; /** * 自定義圓角的ImageView * Created by Administrator on 2017/9/25. */ @SuppressLint("AppCompatCustomView") public class UpRoundImageView extends ImageView { /*圓角的半徑,依次為左上角xy半徑,右上角,右下角,左下角*/ // private float[] rids = {5.0f,5.0f,5.0f,5.0f,0.0f,0.0f,0.0f,0.0f}; private float[] rids ; // public UpRoundImageView(Context context) { // super(context); // } public UpRoundImageView(Context context, AttributeSet attrs) { super(context, attrs); /** * AttributeSet控制項的屬性集合,已鍵值對的形式存在。 * attrs.getAttributeFloatValue(String urlres,String keystr,float default);其中urlstr:attrs資源文件被引用地址,與佈局文件中的保持一直;keystr:自定義屬性的name;default:預設值。該方法輸出為單精度浮點小數。 */ float leftup_radius_l = attrs.getAttributeFloatValue("http://schemas.android.com/apk/res-auto","leftup_radius_l",0.0f); float leftup_radius_r = attrs.getAttributeFloatValue("http://schemas.android.com/apk/res-auto","leftup_radius_r",0.0f); float rightup_radius_l = attrs.getAttributeFloatValue("http://schemas.android.com/apk/res-auto","rightup_radius_l",0.0f); float rightup_radius_r = attrs.getAttributeFloatValue("http://schemas.android.com/apk/res-auto","rightup_radius_r",0.0f); float rightdown_radius_l = attrs.getAttributeFloatValue("http://schemas.android.com/apk/res-auto","rightdown_radius_l",0.0f); float rightdown_radius_r = attrs.getAttributeFloatValue("http://schemas.android.com/apk/res-auto","rightdown_radius_r",0.0f); float leftdown_radius_l = attrs.getAttributeFloatValue("http://schemas.android.com/apk/res-auto","leftdown_radius_l",0.0f); float leftdown_radius_r = attrs.getAttributeFloatValue("http://schemas.android.com/apk/res-auto","leftdown_radius_r",0.0f); rids = new float[]{leftup_radius_l,leftup_radius_r,rightup_radius_l,rightup_radius_r,rightdown_radius_l,rightdown_radius_r,leftdown_radius_l,leftdown_radius_r}; } // public UpRoundImageView(Context context, AttributeSet attrs, int defStyleAttr) { // super(context, attrs, defStyleAttr); // } /** * 畫圖 * @param canvas */ protected void onDraw(Canvas canvas) { Path path = new Path(); int w = this.getWidth(); int h = this.getHeight(); /*向路徑中添加圓角矩形。radii數組定義圓角矩形的四個圓角的x,y半徑。radii長度必須為8*/ path.addRoundRect(new RectF(0,0,w,h),rids,Path.Direction.CCW); canvas.clipPath(path); super.onDraw(canvas); } }
3、佈局文件activity_seconed.xml
xmlns:qiradius="http://schemas.android.com/apk/res-auto",其中的“qiradius”是自定義。
“res-auto”在低版本中可以替換成“你的包名”。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:qiradius="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <com.example.qyn.projectqyn.customviews.UpRoundImageView android:layout_width="60dp" android:layout_height="60dp" qiradius:leftup_radius_l="6.0" qiradius:leftup_radius_r="6.0" qiradius:rightup_radius_l="6.0" qiradius:rightup_radius_r="6.0" qiradius:rightdown_radius_l="6.0" qiradius:rightdown_radius_r="6.0" qiradius:leftdown_radius_l="6.0" qiradius:leftdown_radius_r="6.0" android:src="@mipmap/shouye" android:scaleType="fitXY"/> <TextView android:layout_width="60dp" android:layout_height="60dp" android:text="@string/app_name" android:layout_marginTop="10dp" /> </LinearLayout>
至此,對自定義控制項和屬性的介紹已然完成。下麵將對format所擁有的類型值詳細說明,以及多種類型值疊加的使用。
1. reference:參考某一資源ID。
(1)屬性定義:
代碼如下:
<declare-styleable name = "名稱">
<attr name = "background" format = "reference" />
</declare-styleable>
(2)屬性使用:
代碼如下:
<ImageView
android:layout_width="42dip"
android:layout_height="42dip"
android:background="@drawable/圖片ID"
/>
2.color:顏色值。
(1)屬性定義:
代碼如下:<declare-styleablename="名稱">
<attrname="textColor"format="color"/>
</declare-styleable>
(2)屬性使用:
代碼如下:<TextView
android:layout_width="42dip"
android:layout_height="42dip"
android:textColor="#00FF00"
/>
3.boolean:布爾值。
(1)屬性定義:
代碼如下:<declare-styleablename="名稱">
<attrname="focusable"format="boolean"/>
</declare-styleable>
(2)屬性使用:
代碼如下:<Button
android:layout_width="42dip"
android:layout_height="42dip"
android:focusable="true"
/>
4.dimension:尺寸值。
(1)屬性定義:
代碼如下:<declare-styleablename="名稱">
<attrname="layout_width"format="dimension"/>
</declare-styleable>
(2)屬性使用:
代碼如下:<Button
android:layout_width="42dip"
android:layout_height="42dip"
/>
5.float:浮點值。
(1)屬性定義:
代碼如下:<declare-styleablename="AlphaAnimation">
<attrname="fromAlpha"format="float"/>
<attrname="toAlpha"format="float"/>
</declare-styleable>
(2)屬性使用:
代碼如下:<alpha
android:fromAlpha="1.0"
android:toAlpha="0.7"
/>
6.integer:整型值。
(1)屬性定義:
代碼如下:<declare-styleablename="AnimatedRotateDrawable">
<attrname="visible"/>
<attrname="frameDuration"format="integer"/>
<attrname="framesCount"format="integer"/>
<attrname="pivotX"/>
<attrname="pivotY"/>
<attrname="drawable"/>
</declare-styleable>
(2)屬性使用:
代碼如下:<animated-rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/圖片ID"
android:pivotX="50%"
android:pivotY="50%"
android:framesCount="12"
android:frameDuration="100"
/>
7.string:字元串。
(1)屬性定義:
代碼如下:<declare-styleablename="MapView">
<attrname="apiKey"format="string"/>
</declare-styleable>
(2)屬性使用:
代碼如下:<com.google.android.maps.MapView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"
/>
8.fraction:百分數。
(1)屬性定義:
代碼如下:<declare-styleablename="RotateDrawable">
<attrname="visible"/>
<attrname="fromDegrees"format="float"/>
<attrname="toDegrees"format="float"/>
<attrname="pivotX"format="fraction"/>
<attrname="pivotY"format="fraction"/>
<attrname="drawable"/>
</declare-styleable>
(2)屬性使用:
代碼如下:<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/動畫ID"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="200%"
android:pivotY="300%"
android:duration="5000"
android:repeatMode="restart"
android:repeatCount="infinite"
/>
9.enum:枚舉值。
(1)屬性定義:
代碼如下:<declare-styleablename="名稱">
<attrname="orientation">
<enumname="horizontal"value="0"/>
<enumname="vertical"value="1"/>
</attr>
</declare-styleable>
(2)屬性使用:
代碼如下:<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</LinearLayout>
10.flag:位或運算。
(1)屬性定義:
代碼如下:<declare-styleablename="名稱">
<attrname="windowSoftInputMode">
<flagname="stateUnspecified"value="0"/>
<flagname="stateUnchanged"value="1"/>
<flagname="stateHidden"value="2"/>
<flagname="stateAlwaysHidden"value="3"/>
<flagname="stateVisible"value="4"/>
<flagname="stateAlwaysVisible"value="5"/>
<flagname="adjustUnspecified"value="0x00"/>
<flagname="adjustResize"value="0x10"/>
<flagname="adjustPan"value="0x20"/>
<flagname="adjustNothing"value="0x30"/>
</attr>
</declare-styleable>
(2)屬性使用:
代碼如下:<activity
android:name=".StyleAndThemeActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateUnspecified|stateUnchanged | stateHidden">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
特別要註意:
屬性定義時可以指定多種類型值。
(1)屬性定義:
代碼如下:<declare-styleablename="名稱">
<attrname="background"format="reference|color"/>
</declare-styleable>
(2)屬性使用:
代碼如下:<ImageView
android:layout_width="42dip"
android:layout_height="42dip"
android:background="@drawable/圖片ID|#00FF00"
/> 參考文獻: 1、http://www.jb51.net/article/48962.htm
2、自定義UpRoundImageView控制項很早以前找的,現在找不到出處了。
有更多有趣的用法請留言。