首页
学习
活动
专区
圈层
工具
发布

掌握Android自定义View与独家优化技巧

这个方法决定了View的宽度和高度,通常基于View的内容和布局需求计算测量值。...0, getWidth(), getHeight(), paint); } 步骤4: 在XML布局中使用自定义View 你可以在XML布局文件中使用你的自定义View,就像使用标准的UI组件一样。...适配屏幕尺寸:考虑在不同屏幕尺寸和密度下的表现,以确保用户界面适应不同的设备。 自定义属性:如果需要,可以定义和处理自定义属性,以便在XML布局中配置自定义View。...在自定义View的类中,你可以创建一个Canvas和一个Bitmap,然后在Canvas上绘制内容。这样,在onDraw方法中,你只需要将Bitmap绘制到屏幕上,而不必每次都重新绘制内容。...// 在cacheCanvas上绘制内容 cacheCanvas.drawRect(0, 0, getWidth(), getHeight(), paint); //

94020
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    简单实现满屏表情下落的动画效果,你也可以

    之前在玩微信的时候,给好友发一句“圣诞快乐”就会有满屏的圣诞树往下掉,当时觉得这个动画好酷。正好在公司的项目中需要用到这样的动画效果。于是写了一个小Demo,就有了这篇文章。...x轴上的范围,第二个参数代表在y轴上的范围,第三个参数是表情的图片。...在createDropLook方法中相信大家都看得懂,主要就是用随机数初始化DropLook的坐标及下落速度等。...然后就是用drawBitmap的方法把looks里面逐个绘制出来。并且再把look的y轴坐标加上下落速度等,旋转的角度也是如此。最后就是调用invalidate()不断地重绘。总体上并没有什么难点。...当然DropLookView也有需要改进的地方。比如说可以在布局文件中自定义表情下落的数量等。这些就需要自己根据需求来更改了,那今天就先这样吧。

    1.1K40

    Android 自定义View中的onMeasure onLayout onDraw

    他们的作用 onMeasure 计算当前View的宽高 onLayout 处理子View的布局 onDraw 绘制当前View 调用的顺序为onMeasure–>onLayout–>onDraw..., int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 获取宽-测量规则的模式和大小...这里对比两个方法 getMeasuredHeight() 获取测量的高度 可能和View真实的高度不一样 如果我们不调用requestLayout重新layout的话 getHeight()获取的一直会是之前的高度...getHeight() 获取真实的高度 自定义属性 在values文件夹下,打开attrs.xml,其实这个文件名称可以是任意的,写在这里更规范一点 假设我们用到了两个属性一个宽度,一个颜色值的属性...: 第一个方法,一般我们这样使用时会被调用:View view = new View(context) 第二个方法,当我们在xml布局文件中使用View时,会在inflate布局时被调用 <View layout_width

    2.8K10

    Android自定义控件总结

    绘制流程 onMeasure测量view的大小,设置自己显示在屏幕上的宽高。...(三个构造方法) 第二个是创建布局文件调用的构造函数  2、onMeasure测量view的大小。 设置自己显示在屏幕上的宽高。 ?...对于普通View其MeasureSpec由父容器的Measure和自身的LayoutParams共同确定的。 重写onMeasure为了测量view的大小, 设置自己显示在屏幕上的宽高。...getHeight()和getMeasuredHeight()的区别: 有俩种方法可以获得控件的宽高 getMeasuredHeight(): 控件实际的大小 获取测量完的高度,只要在onMeasure...measure里调用的onmeasure getHeight():控件显示的大小,必须在onLayout方法执行完后,才能获得宽高,这种方法不好,得等所以的都测量完才能获得。

    1.5K80

    Android自定义控件总结

    绘制流程 onMeasure测量view的大小,设置自己显示在屏幕上的宽高。...(三个构造方法) 第二个是创建布局文件调用的构造函数 2、onMeasure测量view的大小。 设置自己显示在屏幕上的宽高。...对于普通View其MeasureSpec由父容器的Measure和自身的LayoutParams共同确定的。 重写onMeasure为了测量view的大小, 设置自己显示在屏幕上的宽高。...getHeight()和getMeasuredHeight()的区别: 有俩种方法可以获得控件的宽高 getMeasuredHeight(): 控件实际的大小 获取测量完的高度,只要在onMeasure...measure里调用的onmeasure getHeight():控件显示的大小,必须在onLayout方法执行完后,才能获得宽高,这种方法不好,得等所以的都测量完才能获得。

    1.2K11

    Android 自定义最大宽度,高度, 宽高比例 Layout

    ---- 原理介绍 原理其实很简单,对自定义 View 有基本了解的人都知道,View 的宽度和高度,是在 onMeasure 方法中进行测量的,他们的大小受 MeasureSpec 的影响。...既然如此,那么我们在继承 FrameLayout,重写它的 onMeasure 方法。在 onMeasure 方法中根据我们指定的最大宽度,高度和比例对 MeasureSpec 进行调整即可。...heightSize = getHeight(heightSize); if (mRatio >= 0) { widthSize = (int) (heightSize...最后,根据相应的 size,mode 生成相应的 MeasureSpec 当模式已高度为基准的时候,我们首先对高度进行调整,是否超出最大高度,超出取最大高度,没超出,取原来的值。...在 API level 26.1.0 的时候,上述的 PercentFrameLayout,PercentRelativeLayout 背标记为过时,并推荐使用 ConstraintLayout。

    2.8K20

    3.2 自定义控件基础 之 View的测量

    Android系统在绘制View之前也必须对View进行测量,即告诉系统该画一个多大的View。这个过程在onMeasure()方法中进行。   ...MeasureSpec是一个32位的值,其中高2位为测量的模式,低30位为测量的大小,在计算中使用位运算的原因是为了提高并优化速率。   测量模式为以下三种。...所以在重写onMeasure()方法后,最重要最的工作就是把测量后的宽高值作为参数传给setMeasuredDimension()方法。   ...当specMode为EXACTLY时,直接使用指定的specSize即可; 当specMode为其他两种模式时,需要给它一个默认的大小。...当指定宽高属性为wrap_content时,如果不写onMeasure()方法,那么系统就不知道该使用默认多大尺寸。

    57530

    【Android笔记】 CustomView

    View工作流程 View工作流程主要指measure、layout、draw这三个流程,即测量、布局和绘制,其中measure确定View的自身的宽高,layout确定View在父容器放置的位置,draw...将View绘制到屏幕上。...自定义控件不重写onMeasure(),View类默认只支持EXACTLY模式,如果让View支持wrap_content属性,必须重写onMeasure()来指定wrap_content大小。...layout layout的作用是ViewGroup用来确定子元素的位置,当ViewGroup的位置被确定后,他在onLayout会遍历所有子元素并调用其layout方法。...draw 重写onDraw()方法,并在Canvas对象上绘制所需要的图形,简而言之,有画笔和画布就可: Android 画笔Paint Android 画布CanvasAndroid之画笔Paint和画布

    54220

    Android 自定义时钟控件 时针、分针、秒针的绘制这一篇就够了

    ; mMinuteDegree = minute / 60 * 360; mHourDegree = hour / 60 * 360; } 最后别忘了在...类对象将这个小三角的边界画出来 由于绘制是在成员方法中进行,所以我们需要定一个 Canvas 对象,来保存 onDraw() 中由于绘制视图的 Canvas 除此之外,秒针是有长度的,所以我们需要一个整型长度变量...Paint 一样,不适合在 onDraw() 中,建议大家在 onSizeChanged 中定义,这个方法的提供了测量长度的各个形参。...() / 2 - 0.03f * mRadius,//绘制指针轴的小圆圈 getWidth() / 2 + 0.03f * mRadius, getHeight() /...close 方法闭合图形即可  至于绘制圆心轴的方法就不说了 就是最基本的绘制圆的方法,先设定 RectF 对象,在调用 fraeArc 方法绘制即可 ---- 绘制时针 绘制是真的过程与绘制分针一模一样

    2K10

    Android开发笔记(九十九)圆形转盘

    = null) { //这里要设置子控件的位置,另外子控件的位置为相对位置不是绝对位置 mImageView.layout(0, 0, 500, 500); } 圆形转盘的知识准备 Math...开发笔记(十三)视图绘制的几个方法》,下面列出的是用到Path和Matrix的方法: clipPath : 根据指定Path路径裁剪画布 drawPath : 在指定Path路径上绘画 drawTextOnPath...: 在指定Path路径上写文本 drawBitmap : 根据指定矩阵画图 Bitmap.createBitmap : 根据指定矩阵创建图像 代码示例 限于篇幅,这里就不贴出圆形转盘的源码了...= null) { //这里要设置子控件的位置,另外子控件的位置为相对位置不是绝对位置 mImageView.layout(0, 0, 500, 500); } } @TargetApi...0, b.getWidth(), b.getHeight(), matrix, false); return rotaBitmap; } public static Bitmap getRotateBitmap2

    2.3K30

    笔记——自定义View(三)

    这时wrap_content就失去了原本的意义,变成了match_parent一样了,所以自定义View在重写onMeasure()的过程中应该手动处理View的宽或高为wrap_content的情况。...这是个正常情况也正是我们改良后的onMeasure()来专门处理的子View大小为wrap_content的情况。...,mBgBitmap.getWidth(),mBgBitmap.getHeight());      //绘制区域     Rect dst =new Rect(0,0,w,h);     //...scrollTo()和scrollBy()时传入的x,y为正值是反常的不是我们料想的那样,以左上角为圆点“右正左负,上负下正”,这是因为源码中如下 ?...总结:LinearLayout和RelativeLayout的性能差别主要体在onMeasure方法上,RelativeLayout始终要从竖直和水平两个方向对子View进行测量,而Linearlayout

    63830

    Android自定义View:源码解析通过getWidth() 与 getMeasuredWidth()获取宽高的区别

    前言 在自定义View的过程中,使用getMeasuredWidth() / getMeasuredHeight() 与 getWidth() / getHeight()都能获取View的宽 / 高,但是二者有什么区别呢...measuredWidth 是从getDefaultSize()获得的 // 在onMeasure()里调用 -> 分析2 /** * 分析2:onMeasure() * 作用:a....return result; } ---- 2. getWidth() / getHeight()返回值 2.1 结论 返回的值是 View在Layout过程中的宽 / 高,即最终的宽 /...应用场景 getMeasuredWidth() / getMeasuredHeight()是在Measure过程中赋值的,所以需在Measure过程后获取的值才有意义 同理,getWidth() / getHeight...中获取View的宽/高 getWidth() / getHeight():在除onLayout()外的地方获取View的宽/高 ---- 4.

    1.9K20

    Android进阶之绘制-自定义View完全掌握(四)

    注意,一定要重写带两个参数的构造方法,因为如果我们在布局文件使用该类,将会用这个构造方法实例该类,如果没有就崩溃。 介绍一下一个控件从创建到显示过程中的主要方法。...执行构造方法实例化类 测量,通过measure方法,需要去重写onMeasure方法 如果当前是一个ViewGroup,它还有义务去测量它的孩子 孩子只有建议权,就是说孩子可以建议控件多高多宽,而最后是必须父类去决定宽高的...方法 根据上面两个方法的一些参数进行绘制 所以我们自定义View一般只需要重写onMeasure(int,int)方法和onDraw(canvas)方法。...我们在绘制第二张图的时候是距离左边距为0,而此时我们已经计算出了开启状态需要距离左边的边距,所以,我们只需这样修改 canvas.drawBitmap(slidingBitmap,slidLeftMax...这个时候,虽然不会出现上次的尴尬情况,但是,这里又有一个问题,就是我在滑动的时候,它总是往我滑动的反方向跑,我想让它向右滑动,可它偏偏就要去左边,这显然也是不行的吧。

    68820
    领券