3.16自定義控件
1.自定義VIEW組件
創(chuàng)建CustomizeView,繼承View。重寫onDraw方法,通過onDraw方法繪制我們自定義的圖像、位圖、路徑等。
示例:文章來源地址http://www.zghlxwxcb.cn/news/detail-829723.html
//自定義繪制View
public class CutomizeView extends View {
//構造方法
public CutomizeView(Context context) {
super(context);
}
//構造方法,這個構造必須有
public CutomizeView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
//重新onDraw方法
@Override
protected void onDraw(Canvas canvas) {
//矩形位置坐標
RectF rectF=new RectF(100,100,400,400);
//畫筆
Paint paint=new Paint();
//設置畫筆
//設置反鋸齒
paint.setAntiAlias(true);
//設置繪制顏色
paint.setColor(0xFF20FF22);
//設置繪制樣式
paint.setStyle(Paint.Style.STROKE);
//設置繪制文本大小
paint.setTextSize(100);
//繪制矩形
canvas.drawRect(rectF,paint);
//繪制橢圓
canvas.drawOval(rectF,paint);
//繪制圓
canvas.drawCircle(300,300,200,paint);
//繪制線段
canvas.drawLine(0,0,100,100,paint);
//繪制文本
canvas.drawText("hello",200,900,paint);
//繪制圓弧
canvas.drawArc(rectF,0,100,true,paint);
//繪制點
canvas.drawPoint(800,800,paint);
//繪制圖片
//bitmap位圖,1、將項目已有圖片轉為bitmap
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
canvas.drawBitmap(bitmap,200,1000,paint);
//2.創(chuàng)建一個bitmap
//Bitmap bitmap1=Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888);
//繪制路徑
drawPath(canvas);
}
//繪制路徑
public void drawPath(Canvas canvas){
Paint paint=new Paint();
paint.setColor(0xFF0022FF);
paint.setStyle(Paint.Style.STROKE);
//繪制路徑
Path path=new Path();
//起點
path.moveTo(300,400);
//直線
path.lineTo(500,200);
path.lineTo(550,350);
path.lineTo(800,700);
//曲線
path.quadTo(500,300,300,800);
canvas.drawPath(path,paint);
}
}
創(chuàng)建對應layout文件,l_customize1.xml文件
示例:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.pro_customizeview.view.CutomizeView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</com.example.pro_customizeview.view.CutomizeView>
</LinearLayout>
補充:Canvas對象坐標變換方法
translate(100,100):平移變化;
rotate(90):旋轉變化;
scale():縮放變化;
save():保存當前坐標系;
restore():銷毀當前坐標系,返回上一次坐標系;
自定義屬性:
在res/values/attrs.xml中創(chuàng)建我們自定義組件屬性。
示例:
定義屬性名和屬性需要數(shù)據格式類型
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CutomizeView">
<attr name="fontColor" format="color"></attr>
<attr name="fontSize" format="dimension"></attr>
</declare-styleable>
</resources>
修改l_customize1.xml文件,設置自定義屬性。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:zdy="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.pro_customizeview.view.CutomizeView
zdy:fontSize="20dp"
zdy:fontColor="@color/colorPrimary"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
在自定義組件CutomizeView中構造函數(shù)中獲取到我們自定義的屬性,然后可以在onDraw,onMeasure,onLayout方法中使用。
//構造方法,這個構造必須有
public CutomizeView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//所有的屬性存放在AttributeSet中
int count = attrs.getAttributeCount();
//1、遍歷獲取
for(int i=0;i<count;i++){
//獲取屬性名
String attrName=attrs.getAttributeName(i);
//獲取屬性值
String attrValue=attrs.getAttributeValue(i);
}
//2、直接獲取到自定義屬性
//在R文件中會自動生成
TypedArray typedArray= context.obtainStyledAttributes(attrs,R.styleable.CutomizeView);
//將獲取到的屬性可以在onDraw,onMesure,onLayout中使用。
int fontColor=typedArray.getColor(R.styleable.CutomizeView_fontColor,0xFF0022FF);
float fontSize=typedArray.getDimension(R.styleable.CutomizeView_fontSize,20);
//注意使用完釋放資源
typedArray.recycle();
}
onMeasure方法和onLayout方法。文章來源:http://www.zghlxwxcb.cn/news/detail-829723.html
示例:
//測量方法,獲取控件寬高,模式
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//調用父類onMeasure方法,實際注釋掉
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//1、獲取mode和size
int widthMode=MeasureSpec.getMode(widthMeasureSpec);
int widthSize=MeasureSpec.getSize(widthMeasureSpec);
int heightMode=MeasureSpec.getMode(heightMeasureSpec);
int heightSize=MeasureSpec.getSize(heightMeasureSpec);
//當父控件為viewgroup時,要獲取子控件寬高,必須先測量一次,強制測量
//否則childView的getMeasuredWidth拿不到寬度
measureChildren(widthMeasureSpec,heightMeasureSpec);
//2、通過mode設置合理size
switch (widthMode){
//父控件對子控件限制最大值,wrap_content
case MeasureSpec.AT_MOST:
//寬度設置,
widthSize = 100dp ;
break;
//控件大小是個確定值,100dp,match_parent(父控件大小確定)等
case MeasureSpec.EXACTLY:
break;
//父控件對子控件大小不做限定
case MeasureSpec.UNSPECIFIED:
break;
}
switch (heightMode){
//父控件對控件限制最大值,wrap_content
case MeasureSpec.AT_MOST:
//寬度設置,
break;
//控件大小是個確定值,layout中設置為具體20dp等或者match_parent,父控件大小確定
case MeasureSpec.EXACTLY:
break;
//父控件對控件大小不做限定,例如:ListView中子item數(shù)量不定
case MeasureSpec.UNSPECIFIED:
br
到了這里,關于Android:自定義控件的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!