国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android:自定義控件

這篇具有很好參考價值的文章主要介紹了Android:自定義控件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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方法。

示例:

//測量方法,獲取控件寬高,模式
@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模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【Android控件】HorizontalScrollView的基礎使用記錄(滾動條自定義)

    【Android控件】HorizontalScrollView的基礎使用記錄(滾動條自定義)

    目錄 ??????? 效果圖 簡介 注意事項 基礎屬性 滾動條全部設置 滾動條是否總顯示 自定義滾動條滑動背景和滾動條背景 設置滾動條的寬度 設置滾動條距離 其它常規(guī)設置 設置滾動速度 布局代碼示例 總結 HorizontalScrollView是水平滾動標簽。垂直滾動動是 ScrollView標簽 H

    2024年02月10日
    瀏覽(62)
  • Android開發(fā)控件形狀之自定義圓角button(三種形態(tài))

    Android開發(fā)控件形狀之自定義圓角button(三種形態(tài))

    第一步:在drawable文件下創(chuàng)建button的形狀描述文件btn_shape.xml btn1.xml btn2.xml btn3.xml 第二步:在布局文件中l(wèi)ayout.xml中對btn1.xml以上三種其中一種的引用語句,用來設置button形狀: android:background=\\\"@drawable/btn1\\\" 效果圖: 點擊前 點擊后 ? ? 解析shape文件中的android:shape屬性: ?Android

    2024年02月13日
    瀏覽(21)
  • 【Android筆記108】Android之翻轉視圖組件ViewFlipper的使用

    這篇文章,主要介紹Android之翻轉視圖組件ViewFlipper的使用。 目錄 一、翻轉視圖ViewFlipper 1.1、什么是ViewFlipper 1.2、運行效果 (1)不帶動畫的效果

    2024年02月08日
    瀏覽(18)
  • Android筆記(二十一):Room組件實現(xiàn)Android應用的持久化處理

    Android筆記(二十一):Room組件實現(xiàn)Android應用的持久化處理

    Room是Android JetPack架構組件之一,是一個持久處理的庫。Room提供了在SQLite數(shù)據庫上提供抽象層,使之實現(xiàn)數(shù)據訪問。 (1)實體類(Entity):映射并封裝了數(shù)據庫對應的數(shù)據表中對應的結構化數(shù)據。實體定義了數(shù)據庫中的數(shù)據表。實體類中的數(shù)據域與表的列一一對應。 (2)數(shù)

    2024年01月20日
    瀏覽(29)
  • Android筆記(七)Android JetPack Compose組件搭建Scaffold腳手架

    Android筆記(七)Android JetPack Compose組件搭建Scaffold腳手架

    在去年2022年曾發(fā)布一篇關于腳手架的文章:“Android JetPack Compose組件中Scaffold的應用” 。但是Android的版本從12變更到13及以上版本,導致一些細節(jié)的實現(xiàn)存在不同。在本文中,將從頭開始介紹整個腳手架的搭建過程。 在Android Studio(版本是Graffie)中新建模塊,選擇“Empty Activ

    2024年02月04日
    瀏覽(92)
  • Android筆記(九):Compose組件的狀態(tài)(一)

    Android筆記(九):Compose組件的狀態(tài)(一)

    在使用Compose定義UI界面時,可以發(fā)現(xiàn)界面的變換往往與Compose組件內部的狀態(tài)相關,當狀態(tài)值發(fā)生變化時,Compose構成的可組合的界面也會刷新發(fā)生相應的變化。將在本筆記中將對可組合項的狀態(tài)的定義、狀態(tài)提升、狀態(tài)丟失和狀態(tài)的保存進行簡單介紹。。 Compose采用了單向數(shù)據

    2024年02月06日
    瀏覽(27)
  • 【Android Framework系列】第13章 SVG矢量圖形自定義組件(繪制中國地圖)

    【Android Framework系列】第13章 SVG矢量圖形自定義組件(繪制中國地圖)

    本章節(jié)我們來了解下什么是 SVG 矢量圖形,怎么通過 SVG 實現(xiàn)圖形的繪制,通過 SVG 實現(xiàn)不規(guī)則的自定義控件,項目實現(xiàn)一個中國地圖,實現(xiàn)每個省都能夠點擊,項目地址在文末請自取。 SVG 指可伸縮矢量圖形 (Scalable Vector Graphics) SVG 用來定義用于網絡的基于矢量的圖形 SVG 使用

    2024年02月10日
    瀏覽(25)
  • Android筆記(六):JetPack Compose常見的UI組件

    Android筆記(六):JetPack Compose常見的UI組件

    Text顯示的文本來源可以引用res-values-strings.xml中的資源,如第一個顯示文本所示。 點擊按鈕前: 點擊按鈕后: 點擊第一個圓角按鈕不放時,顯示為按鈕:true Button有兩方面需要注意: (1) Buttton有一個參數(shù)interactionSource,用來監(jiān)聽組件狀態(tài)的事件源,通過它獲取組件的狀態(tài)來

    2024年02月04日
    瀏覽(121)
  • Android Kotlin Java 自定義日歷控件 CalendarView ,支持單選,多選,按星期選,跨月份日期范圍選擇,樣式設置,設置不可選日期,設置只可選日期

    Android Kotlin Java 自定義日歷控件 CalendarView ,支持單選,多選,按星期選,跨月份日期范圍選擇,樣式設置,設置不可選日期,設置只可選日期

    https://github.com/hdev0225/CalendarView CalendarView 使用kotlin語言開發(fā),支持單選,多選,按星期選,跨月份日期范圍選擇,樣式設置,設置不可選日期,設置只可選日期 設置不可選擇日期,設置只可選擇某些日期 AS 版本: Android Studio Dolphin | 2021.3.1 Android Gradle Plugin Version: 7.3.0 Gradle

    2024年02月09日
    瀏覽(92)
  • Android筆記(十):結合Navigation組件實現(xiàn)Compose界面的導航

    Android筆記(十):結合Navigation組件實現(xiàn)Compose界面的導航

    在Android筆記(七)搭建Android JetPack Compose組件中Scaffold腳手架 一文中通過定義一個導航的函數(shù)來實現(xiàn)不同界面的切換。如果沒有傳遞任何參數(shù),這樣的導航處理也是可以接受的,處理方式也非常簡單。但是,如果考慮到不同Compose界面的切換且傳遞參數(shù),或者有更復雜地處理情

    2024年01月22日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包