android自定义view之自定义属性

简介: 这两天在Android中用到了自定义view,在自定义view时也顺便使用了下自定义属性。自定义属性以前只是耳闻 未曾谋面,这次借机会对自定义属性进行了一番学习,顺便总结了一下自定义属性的使用。

这两天在Android中用到了自定义view,在自定义view时也顺便使用了下自定义属性。自定义属性以前只是耳闻 未曾谋面,这次借机会对自定义属性进行了一番学习,顺便总结了一下自定义属性的使用。
下面扫盲班老司机要开车了,小白快刷卡上车,大神拒载。


img_75344b054c67b12b237be903e9bbcb8c.jpe
老司机

Android中经常用到自定义view,既然用了自定义view那就不得不提自定义属性。你是否思考过为什么我们在xml文件中进行布局时可以直接通过android:layout_width="match_parent"就可以设置控件的宽度呢?不只是宽度,几乎控件的所有属性都可以在xml文件中进行设置,这是怎样实现的呢,this is a question

img_3e94fed8f19b9f20a0cc5200e10a6c59.png
TextView部分属性

我们自定义view时能不能也像系统提供的控件一样在xml文件中设置属性呢。答案是当然可以了,用到的就是今天要说的自定义属性。废话不多说 直接开干。
1,首先在res 的values文件夹下新建一个attrs.xml文件,就是这样


img_f0e8aafa9740d2a7fb6a32f64410bd30.png
新建的attrs.xml文件

2,开始编写我们需要的属性。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="burce">
        <attr name="mHeight" format="integer"/>
        <attr name="mWidth" format="integer"/>
        <attr name="mName" format="string"/>
        <attr name="sex" format="enum">
            <enum name="man" value="0"/>
            <enum name="woman" value="1"/>
        </attr>
        <attr name="student" format="boolean"/>
    </declare-styleable>
</resources>

说一下用到的东西
<declare-styleable name="burce">其中的name的值随便定义一个,不要与系统的起冲突。
<attr name="mHeight" format="integer"/>name就是自定义的属性的名字(比如系统控件的android:layout_width) format 就是属性的类型,这里支持10种类型,常用的有string,integer,boolean等等,这次我们用到了整形,枚举和布尔
注意:我们在自定义属性的名字的时候不能与系统的名字冲突,否则会报错

3,新建一个类继承View类,实现3个构造方法,然后获取我们自定义的属性

public class MyView extends View {
    private static final String TAG = "MyView";
    private int heiget;
    private int width;
    private String name;
    private int sex;
    private boolean student;
    public MyView(Context context) {
        this(context,null);
    }

    public MyView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.burce);
        heiget=array.getInt(R.styleable.burce_mHeight,0);
        width=array.getInt(R.styleable.burce_mWidth,0);
        name=array.getString(R.styleable.burce_mName);
        sex=array.getInt(R.styleable.burce_sex,0);
        student=array.getBoolean(R.styleable.burce_student,true);
        array.recycle();

        Log.i(TAG, "height: "+heiget);
        Log.i(TAG, "width: "+width);
        Log.i(TAG, "name: "+name);
        Log.i(TAG, "sex: "+sex);
        Log.i(TAG, "student: "+student);

    }
}

TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.burce);

img_b22840ce0b53402a7a5d5ece177cda52.png
Android Developers

这是Google官方给的解释,就简单说一下两个参数怎么填吧,第一个填形参的attrs,第二个填 R.styleable是固定写法,bruce是 <declare-styleable name="burce">中的name的值。
4,回到MainActivity的布局文件中使用我们的自定义view

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.myviewtest.MainActivity">
    <com.myviewtest.MyView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:mName="bruce"
        app:sex="man"
        app:mHeight="100"
        app:mWidth="100"
        app:student="true"/>
</RelativeLayout>

注意:如果Android studio没有加上命名空间的话需要自己加上xmlns:app="http://schemas.android.com/apk/res-auto" 只有声明了命名空间才能使用自定义属性,不懂啥是命名空间的同学呢自己Google学习一下吧(最近在学C++,我就安C++中的命名空间理解的,如果不正确还请大神赐教)
<attr name="height" format="integer"/> 这里的我们在这用了app命名空间,所有所有的自定义属性的开头都加上了“app:”。

准备工作都做好了接下来我们吧应用跑起来看看吧,这里我们通过打印log查看自定义属性的值。

img_1533f8662b53f1d94829f5456f1ec3c1.png
运行结果

通过log可以得知 我们在自定义view中成功的获取到了属性的值。好的老司机平安到站,小白有序下车。
由于你遇到了一个假的老司机,文章中如果有不正确的地方还请各位大神在评论区指正,老司机在这里抱拳了。

目录
相关文章
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
842 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
Android开发
Android自定义view之利用PathEffect实现动态效果
本文介绍如何在Android自定义View中利用`PathEffect`实现动态效果。通过改变偏移量,结合`PathEffect`的子类(如`CornerPathEffect`、`DashPathEffect`、`PathDashPathEffect`等)实现路径绘制的动态变化。文章详细解析了各子类的功能与参数,并通过案例代码展示了如何使用`ComposePathEffect`组合效果,以及通过修改偏移量实现动画。最终效果为一个菱形图案沿路径运动,源码附于文末供参考。
320 0
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
597 65
Android自定义view之网易云推荐歌单界面
|
XML 前端开发 Android开发
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
1066 84
|
前端开发 Android开发 UED
讲讲Android为自定义view提供的SurfaceView
本文详细介绍了Android中自定义View时使用SurfaceView的必要性和实现方式。首先分析了在复杂绘制逻辑和高频界面更新场景下,传统View可能引发卡顿的问题,进而引出SurfaceView作为解决方案。文章通过Android官方Demo展示了SurfaceView的基本用法,包括实现`SurfaceHolder.Callback2`接口、与Activity生命周期绑定、子线程中使用`lockCanvas()`和`unlockCanvasAndPost()`方法完成绘图操作。
421 3
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
375 2
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
679 3
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
View的绘制和事件处理是两个重要的主题,上一篇《图解 Android事件分发机制》已经把事件的分发机制讲得比较详细了,这一篇是针对View的绘制,View的绘制如果你有所了解,基本分为measure、layout、draw 过程,其中比较难理解就是measure过程,所以本篇文章大幅笔地分析measure过程,相对讲得比较详细,文章也比较长,如果你对View的绘制还不是很懂,对measure过程掌握得不是很深刻,那么耐心点,看完这篇文章,相信你会有所收获的。
655 3
|
消息中间件 前端开发 Android开发
Android面试题自定义View之Window、ViewRootImpl和View的三大流程
Android开发中,View的三大核心流程包括measure(测量)、layout(布局)和draw(绘制)。MeasureSpec类在测量过程中起到关键作用,它结合尺寸大小和模式(EXACTLY、AT_MOST、UNSPECIFIED)来指定View应如何测量。onMeasure方法用于自定义View的测量,布局阶段,ViewGroup调用onLayout确定子元素位置,而draw阶段按照特定顺序绘制背景、内容、子元素和装饰。整个流程始于ViewRootImpl的performTraversals,该方法触发测量、布局和绘制。
548 0

热门文章

最新文章