4.自定义view总结

自定义view 对象显示的屏幕上,有几个重要步骤:

1、构造方法 创建 对象。(就是那三个构造方法)

第二个是创建布局文件调用的构造函数

2、测量view的大小。 设置自己显示在屏幕上的宽高, onMeasure(int,int)

  • setMeasuredDimension(backgroundBitmap.getWidth(),backgroundBitmap.getHeight());如果知道了自定义控件的大小,那么就这样设置当前view的大小,用这个需要super去掉,继承view的话这样写
  • 但是如果需要重新测量或者动态改变自定义控件大小那就需要根据自己需求重写规则makeMeasureSpec,简单说就是规则改变了就需要重写规则,再通过measure方法测量,重写测完的宽高这样写getMeasuredWidth()。继承viewgroup的话这样写,因为viewGroup 有责任计算每个孩子的大小

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int size = MeasureSpec.getSize(widthMeasureSpec);

int mode = MeasureSpec.getMode(widthMeasureSpec);

for (int i = 0; i < getChildCount(); i++) {

View v = getChildAt(i);

v.measure(widthMeasureSpec, heightMeasureSpec);

//			v.getMeasuredWidth() // 得到测量的大小

}		

3、确定view的位置 ,view自身有一些建议权,决定权在 父view手中。 设置自己显示在屏幕上的位置(只有在自定义ViewGroup中才用到)

  • 参数说明:参数changed表示view有新的尺寸或位置;参数l表示相对于父view的Left位置;参数t表示相对于父view的Top位置;参数r表示相对于父view的Right位置;参数b表示相对于父view的Bottom位置。左上右下
  • 调用场景:在view给其孩子设置尺寸和位置时被调用。子view,包括孩子在内,必须重写onLayout(boolean, int, int, int, int)方法,并且调用各自的layout(int, int, int, int)方法。

protected void onLayout(boolean changed, int left, int top, int right,

int bottom) {

super.onLayout(changed, left, top, right, bottom);

}

4、绘制 view 的内容 。 onDraw(Canvas)

控制显示在屏幕上的样子(自定义viewgroup时不需要这个)

绘制 背景

/*

* backgroundBitmap 要绘制的图片

* left 图片的左边届

* top 图片的上边届

* paint 绘制图片要使用的画笔

*/

canvas.drawBitmap(backgroundBitmap, 0, 0, paint);

View和ViewGroup的区别

  1. 他们都需要进行测量操作
  2. ViewGroup主要是控制子view如何摆放,所以必须实现onLayout。
  3. View没有子view,所以不需要onLayout方法,但是必须实现onDraw
  4. 在自定义ViewGroup中一般不需要去实现onMeasure, 我们去实现系统已有的ViewGroup,比如FrameLayout,  它会帮我们区实现onMeasure方法

getHeight()和getMeasuredHeight()的区别:

  • getMeasuredHeight(): 控件实际的大小

获取测量完的高度,只要在onMeasure方法执行完,就可以用它获取到宽高,在自定义控件内部多使用这个使用view.measure(0,0)方法可以主动通知系统去测量,然后就可以直接使用它获取宽高

  • getHeight():控件显示的大小,必须在onLayout方法执行完后,才能获得宽高
  1. view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
  2. @Override
  3. public void onGlobalLayout() {
  4. headerView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
  5. int headerViewHeight = headerView.getHeight();
  6. //直接可以获取宽高
  7. }
  8. });

这俩个一般情况是一样的,但是在viewgroup里getWidth是父类给子view分配的空间:右边-左边

自定义view常用方法

来自为知笔记(Wiz)

附件列表

时间: 2024-11-16 21:16:53

4.自定义view总结的相关文章

自定义View 篇三 《手动打造ViewPage》

有了之前自定义View的理论基础,有了ViewPage.事件分发机制.滑动冲突.Scroller使用等相关知识的铺垫,今天纯手动打造一款ViewPage. 1.完成基本的显示: 在MainActivity中: public class MainActivity extends AppCompatActivity { private MyViewPage mViewPage; int[] imageIds = new int[]{ R.drawable.pic_0, R.drawable.pic_

九点(九宫格)式手势解锁自定义view

周末闲着没事,写了个手势解锁的view,实现起来也蛮快的,半天多一点时间就完事.把源码和资源贴出来,给大家分享,希望对大家有用. 效果,就跟手机上的九点手势解锁一样,上个图吧: 过程嘛感觉确实没啥好讲的了,涉及的知识以前的博客都说过了,无非就是canva,paint,touch事件这些,画画圆圈画画线条,剩下的就是细节处理逻辑了.都在代码里,所以这里就主要是贴资源吧. 这个自定义view就一个类,源码如下: package com.cc.library.view; import android.

iOS开发——笔记篇&amp;关于字典plist读取/字典转模型/自定义View/MVC/Xib的使用/MJExtension使用总结

关于字典plist读取/字典转模型/自定义View/MVC/Xib的使用/MJExtension使用总结 一:Plist读取 1 /******************************************************************************/ 2 一:简单plist读取 3 4 1:定义一个数组用来保存读取出来的plist数据 5 @property (nonatomic, strong) NSArray *shops; 6 7 2:使用懒加载的方

自定义View之实现日出日落太阳动效

以前也很羡慕网上大神随手写写就是一个很漂亮的自定义控件,所以我下决心也要学着去写,刚好最近复习了Android View的绘制流程知识,看来看去就是那些个知识点,没点产出总感觉很迷.现在个人呢用的是华为荣耀8手机,碰巧在看自带的天气APP时,滑到最下面看到那个动效图:日出时间和日落时间上边是一个半圆,白天任意的时刻(在日出和日落时间之间)都有对应一个太阳从日出时刻沿着半圆弧做动画特效,个人第一感觉就是:就拿这个来练练手啦!于是拿着笔和纸,画了模型图,甚至求什么sin.cos函数,有点过分了哈,还

Android 自定义View

最近在看鸿洋大神的博客,在看到自定义部分View部分时,想到之前案子中经常会要用到"图片 + 文字"这类控件,如下图所示: 之前的做法是在布局文件中,将一个Image & TextView组件放在LinearLayout/RelativeLayout中.今天就尝试了通过自定义View的方式来实现"图片 + 文字"组件. 首先在/res/value/目录下新建attrs.xml文件,在该文件中为CustomTextView定义以下几个attr.分别为 1.文字

Android自定义View探索(一)—生命周期

Activity代码: public class FiveActivity extends AppCompatActivity { private MyView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("log", "Activity生命周期:onCreate"); setConte

Android自定义view之仿支付宝芝麻信用仪表盘

自定义view练习 仿支付宝芝麻信用的仪表盘 对比图: 首先是自定义一些属性,可自己再添加,挺基础的,上代码 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="RoundIndicatorView"> <!--最大数值--> <attr name="maxNum" form

自定义view—折线图

学习导航 第一节:http://blog.csdn.net/bobo8945510/article/details/53197727 -自定义View-自定义属性及引用 第二节:http://blog.csdn.net/bobo8945510/article/details/53203233 自定义view02-图形绘制 第三节:http://blog.csdn.net/bobo8945510/article/details/53213938 自定义View-绘图基础之Path 第四节:http

Android笔记自定义View之制作表盘界面

前言 最近我跟自定义View杠上了,甚至说有点上瘾到走火入魔了.身为菜鸟的我自然要查阅大量的资料,学习大神们的代码,这不,前两天正好在郭神在微信公众号里推送一片自定义控件的文章--一步步实现精美的钟表界面.正适合我这种菜鸟来学习,闲着没事,我就差不多依葫芦画瓢也写了一个自定义表盘View,现在纯粹最为笔记记录下来.先展示下效果图: 下面进入正题 自定义表盘属性 老规矩,先在attrs文件里添加表盘自定义属性 <declare-styleable name="WatchView"&

Android 创建自定义 View 的属性 (attrs) 时需要注意的问题

自定义 View 的属性并不难,可以参照官方的文档 https://developer.android.com/training/custom-views/create-view.html 但是需要注意一个问题,否则可能浪费很多时间. <resources> <declare-styleable name="AppsControllerBlock"> <attr name="letterCase" format="enum&q