Android:自定义控件

这篇具有很好参考价值的文章主要介绍了Android:自定义控件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3.16自定义控件

1.自定义VIEW组件

创建CustomizeView,继承View。重写onDraw方法,通过onDraw方法绘制我们自定义的图像、位图、路径等。

示例:文章来源地址https://www.toymoban.com/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.创建一个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);
    }
}

创建对应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中创建我们自定义组件属性。

示例:

定义属性名和属性需要数据格式类型

<?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中构造函数中获取到我们自定义的属性,然后可以在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数量不定
        case MeasureSpec.UNSPECIFIED:
            br

到了这里,关于Android:自定义控件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android控件】HorizontalScrollView的基础使用记录(滚动条自定义)

    目录 ​​​​​​​ 效果图 简介 注意事项 基础属性 滚动条全部设置 滚动条是否总显示 自定义滚动条滑动背景和滚动条背景 设置滚动条的宽度 设置滚动条距离 其它常规设置 设置滚动速度 布局代码示例 总结 HorizontalScrollView是水平滚动标签。垂直滚动动是 ScrollView标签 H

    2024年02月10日
    浏览(30)
  • Android开发控件形状之自定义圆角button(三种形态)

    第一步:在drawable文件下创建button的形状描述文件btn_shape.xml btn1.xml btn2.xml btn3.xml 第二步:在布局文件中layout.xml中对btn1.xml以上三种其中一种的引用语句,用来设置button形状: android:background=\\\"@drawable/btn1\\\" 效果图: 点击前 点击后     解析shape文件中的android:shape属性:  Android

    2024年02月13日
    浏览(33)
  • 【Android笔记108】Android之翻转视图组件ViewFlipper的使用

    这篇文章,主要介绍Android之翻转视图组件ViewFlipper的使用。 目录 一、翻转视图ViewFlipper 1.1、什么是ViewFlipper 1.2、运行效果 (1)不带动画的效果

    2024年02月08日
    浏览(47)
  • Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架

    在去年2022年曾发布一篇关于脚手架的文章:“Android JetPack Compose组件中Scaffold的应用” 。但是Android的版本从12变更到13及以上版本,导致一些细节的实现存在不同。在本文中,将从头开始介绍整个脚手架的搭建过程。 在Android Studio(版本是Graffie)中新建模块,选择“Empty Activ

    2024年02月04日
    浏览(33)
  • Android笔记(二十一):Room组件实现Android应用的持久化处理

    Room是Android JetPack架构组件之一,是一个持久处理的库。Room提供了在SQLite数据库上提供抽象层,使之实现数据访问。 (1)实体类(Entity):映射并封装了数据库对应的数据表中对应的结构化数据。实体定义了数据库中的数据表。实体类中的数据域与表的列一一对应。 (2)数

    2024年01月20日
    浏览(44)
  • Android笔记(九):Compose组件的状态(一)

    在使用Compose定义UI界面时,可以发现界面的变换往往与Compose组件内部的状态相关,当状态值发生变化时,Compose构成的可组合的界面也会刷新发生相应的变化。将在本笔记中将对可组合项的状态的定义、状态提升、状态丢失和状态的保存进行简单介绍。。 Compose采用了单向数据

    2024年02月06日
    浏览(32)
  • 【Android Framework系列】第13章 SVG矢量图形自定义组件(绘制中国地图)

    本章节我们来了解下什么是 SVG 矢量图形,怎么通过 SVG 实现图形的绘制,通过 SVG 实现不规则的自定义控件,项目实现一个中国地图,实现每个省都能够点击,项目地址在文末请自取。 SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用来定义用于网络的基于矢量的图形 SVG 使用

    2024年02月10日
    浏览(54)
  • Android笔记(六):JetPack Compose常见的UI组件

    Text显示的文本来源可以引用res-values-strings.xml中的资源,如第一个显示文本所示。 点击按钮前: 点击按钮后: 点击第一个圆角按钮不放时,显示为按钮:true Button有两方面需要注意: (1) Buttton有一个参数interactionSource,用来监听组件状态的事件源,通过它获取组件的状态来

    2024年02月04日
    浏览(36)
  • Android Kotlin Java 自定义日历控件 CalendarView ,支持单选,多选,按星期选,跨月份日期范围选择,样式设置,设置不可选日期,设置只可选日期

    https://github.com/hdev0225/CalendarView CalendarView 使用kotlin语言开发,支持单选,多选,按星期选,跨月份日期范围选择,样式设置,设置不可选日期,设置只可选日期 设置不可选择日期,设置只可选择某些日期 AS 版本: Android Studio Dolphin | 2021.3.1 Android Gradle Plugin Version: 7.3.0 Gradle

    2024年02月09日
    浏览(28)
  • Android笔记(十):结合Navigation组件实现Compose界面的导航

    在Android笔记(七)搭建Android JetPack Compose组件中Scaffold脚手架 一文中通过定义一个导航的函数来实现不同界面的切换。如果没有传递任何参数,这样的导航处理也是可以接受的,处理方式也非常简单。但是,如果考虑到不同Compose界面的切换且传递参数,或者有更复杂地处理情

    2024年01月22日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包