自定义View学习笔记-1

继承View重写onDraw方法

对于直接继承自View的控件,如果不对wrap_content做特殊处理,那么使用wrap_content就相当于mathc_parent.

处理:只需要制定一个wrap_content模式的默认宽/高

代码如下:

@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);    int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);    int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);    int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);    if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST) {        setMeasuredDimension(200, 200);    } else if (widthSpecMode == MeasureSpec.AT_MOST) {        setMeasuredDimension(200, heightMeasureSpec);    } else if (heightSpecMode == MeasureSpec.AT_MOST) {        setMeasuredDimension(widthSpecSize, 200);    }}

直接继承自View和ViewGroup的控件,padding是默认无法生效的,需要自己处理。

处理代码:

@Overrideprotected void onDraw(Canvas canvas) {    super.onDraw(canvas);    final int paddingLeft = getPaddingLeft();    final int paddingRight = getPaddingRight();    final int paddingTop = getPaddingTop();    final int paddingBotton = getPaddingBottom();    int width = getWidth() - paddingLeft - paddingRight;    int height = getHeight() - paddingTop - paddingBotton;    int radius = Math.min(width, height) / 2;    canvas.drawCircle(paddingLeft + width / 2, paddingTop + height / 2, radius, mPaint);}

还需要为其提供自定义属性

第一步:在values目录下面创建自定义属性的XML,比如attrs.xml,文件夹名取合适的名字:创建attrs.xml文件
<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="CircleView">        <attr name="circle_color" format="color"/>    </declare-styleable></resources>这里定义一个格式为"color"的属性“circle_color”,指的是颜色refrence是指资源iddimension是指尺寸string、integer、boolean是指基本数据类型

第二步:在View的构造方法中解析自定义属性的值并做相应处理构造方法中:
public CircleView(Context context,AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleView);    mColor = a.getColor(R.styleable.CircleView_circle_color, Color.RED);    a.recycle();    init();}首先加载自定义属性集合CircleView,接着解析CircleView属性集合中的circle_color属性,它的id为:R.styleable.CircleView_circle_color过程中,如果在使用时没有指定circle_color这个属性,那么就会选择红色作为默认的颜色值,解析完自定义属性后,通过recycle方法来实现资源。

第三步:在布局中使用自定义属性
<yuer.com.uitestdemo.ui.CircleView    android:id="@+id/circle_view1"    android:layout_width="match_parent"    android:layout_height="100dp"    android:layout_margin="20dp"    android:background="#000000"    android:padding="20dp"    app:circle_color="@color/light_green"/>
时间: 2024-10-10 05:41:29

自定义View学习笔记-1的相关文章

Android自定义View学习笔记04

Android自定义View学习笔记04 好长时间没有写相关的博客了,前几周在帮学姐做毕设,所以博客方面有些耽误.过程中写了一个类似wp的磁贴的view,想再写个配套的layout,所以昨天看了一下自定义viewGroup的相关知识-晚上睡觉想了一下可行性不是很高-代码量还不如直接自己在xml上写来得快,速度上也是个问题.今天看了一下张鸿洋老师的Android 自定义View (三) 圆环交替 等待效果这篇博文,再加上前一段时间看到的一幅图,结合之前写的一个圆形imageView的实现博文And

Android自定义View学习笔记03

Android自定义View学习笔记03 预备知识 BitMap类 BitMap位图类,其中有一个嵌套类叫Bitmap.Config,内部有四个枚举值.这个类的作用是定义位图存储质量,即存储一个像素的位数,以及是否能显示透明.半透明颜色(Possible bitmap configurations. A bitmap configuration describes how pixels are stored. This affects the quality (color depth) as w

Android自定义view学习笔记02

Android自定义view学习笔记02 本文代码来自于张鸿洋老师的博客之Android 自定义View (二) 进阶 学习笔记,对代码进行些许修改,并补充一些在coding过程中遇到的问题.学习的新东西. 相关代码 //CustomImageView.java package mmrx.com.myuserdefinedview.textview; import android.content.Context; import android.content.res.TypedArray; im

【转载】自定义View学习笔记之详解onMeasure

网上对自定义View总结的文章都很多,但是自己还是写一篇,好记性不如多敲字! 其实自定义View就是三大流程,onMeasure.onLayout.onDraw.看名字就知道,onMeasure是用来测量,onLayout布局,onDraw进行绘制. 那么何时开始进行View的绘制流程,这就要从ViewRoot和DecorView的概念说起. ViewRoot对应于ViewRootImpl类,是连接WindowManager和DecorView的纽带,View的三大绘制流程都是通过ViewRoo

自定义View学习之12/1

感谢AigeStudio提供的自定义view讲解(地址http://blog.csdn.net/aigestudio)下面是我看了Aige的讲解之后自己的理解以及demo,有说错的地方欢迎大家指出. 在这里自定义一个圆形等级条的view来加强自己对自定义的理解. 思路: 1.需要画一个背景圆,再需要一个覆盖在背景圆上面的进度圆. 2.使用线程让进度圆产生动画. 3.在进度圆达到圆满的时候回到原点,给个回调. 现在我们先画出一个空心圆. 代码块 /** 背景圆的画笔 */ private Pain

Android 自定义View学习(2)

上一篇学习了基本用法,今天学一下稍微复杂一点的,先看一下效果图 为了完成上面的效果还是要用到上一期开头的四步 1,属性应该要有颜色,要有速度 <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="speed" format="integer" /> <attr name="circleColor"

自定义View学习之12/7(进度条之混合模式)

今天重点内容是我们学习自定义view里面的混合模式,其实我们的画布就跟photoshop一样,是个图层关系,一层盖着一层,这样就导致有很多种覆盖模式,这就是我们今天的主题,"混合模式". 好,现在我们来看下这个模式的说明图: canvas原有的图片 可以理解为背景 就是dst 新画上去的图片 可以理解为前景 就是src 从上面我们可以看到PorterDuff.Mode为枚举类,一共有16个枚举值: 1.PorterDuff.Mode.CLEAR 所绘制不会提交到画布上. 2.Porte

20170831工作日记--自定义View学习

学习了LayoutInflater的原理分析.视图的绘制流程.视图的状态及重绘等知识,按类型来划分的话,自定义View的实现方式大概可以分为三种,自绘控件.组合控件.以及继承控件.那么下面我们就来依次学习一下,每种方式分别是如何自定义View的. (一)自绘控件 自绘控件的意思就是,这个View上所展现的内容全部都是我们自己绘制出来的.绘制的代码是写在onDraw()方法中的.参考相关博客 http://blog.csdn.net/guolin_blog/article/details/1735

自定义View学习

我一直在学习Android,但是一直对自定义View不是太熟悉,这几天看了下,分享下: 自定义View从他的实现方式可以分成三类 (1) 自己绘制控件:就是通过继承View来进行绘制,只要继承 了View  复写他的onDraw()方法就可以进行简单的绘制: 例如这样的代码: @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); mCanv