![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android自定义view
wjxbless
如果觉得简单,那就多思考
展开
-
Android自定义姓名头像
简介在WanAndroid项目中涉及到用户头像的生成,需求有以下几点:仿照探照灯效果头像含有用户姓名复习View绘制流程Android窗口机制PhoneWindow:继承自Window类,负责管理界面显示以及事件响应,每个Activity 界面都包含一个PhoneWindow对象,它是Activity和整个View系统交互的接口。DecorView:是PhoneW...原创 2020-02-07 23:52:39 · 978 阅读 · 0 评论 -
Matrix与坐标变换
ColorMatrix色彩变换对于色彩的存储,Bitmap类使用一个32位的数值来保存,红,绿,蓝以及透明度各占8位,每个色彩分量的取值范围是0~255,透明度为0表示完全透明,为255时色彩完全可见色彩矩阵的表示:由于一个色彩信息包含R、G、B、Alpha信息,所以,必须使用一个四阶色彩变幻矩阵来修改色彩的每一个分量,对于色彩矩阵来说色彩顺序是R、G、B、A如果想要原有的R色上增加...原创 2019-07-04 20:36:42 · 1024 阅读 · 1 评论 -
双缓冲技术解决方案
解决方案一:保存索要绘制的内容,全屏重绘:为了防止每次画布上绘制的,第一种解决方案是:每次将我们绘制的内容都保存起来,下次拿到画布时,把这些绘制的内容全部重新绘制一遍,但是这种方案主要用于比较简单的绘图上private void drawText(final Surfaceholder holder){ Canvas canvas = holder.lockCanvas(); ...原创 2019-07-04 17:28:14 · 250 阅读 · 0 评论 -
Android画布(二)ShapeDrawable常用函数
ShapeDrawable常用函数setBounds()用来指定当前ShapeDrawable在当前控件中的显示位置setBounds(int left, int top, int right, int bottom)setBounds(Rect bounds)getPaint()(1)通过这个函数得到ShapeDrawable自带的画笔,如果对画笔进行操作,会立即展现在Sh...原创 2019-06-28 14:48:02 · 389 阅读 · 0 评论 -
双缓冲技术局部更新原理
SurfaceView支持局部更新,可以通过Canvas lockCanvas(Rect dirty)函数指定获取画布的区域和大小,画布以外的地方会将现在屏幕上的内容复制过来,以保持与屏幕一致,而画布以内的部分将会保持原画布的内容:lockCanvas():用于获取整个画布的内容,屏幕内容不会被更新到画布上,画布保持原画布内容(不会进程当前屏幕内容,只保持所有在自己上面所画的内容利用unloc...原创 2019-07-03 20:06:23 · 347 阅读 · 0 评论 -
Android画布(一 )
获取画布的方法* onDraw()* diapatchDraw()* 通过Bitmap创建* 通过SurfaceView的SurfaceHolder.lockCanvas()Drawable类可以通过创建dawable对象,然后将画好的drawable对象画在画布上,也是创建Bitmap的一种方式ShapeDrawableshape标签与GradientDrawable首...原创 2019-06-27 21:39:18 · 1091 阅读 · 0 评论 -
Canvas与图层(一)Canvas创建与画布状态操作
获取Canvas对象的方法方法一:重写onDraw()、dispatchDraw()函数构建方法:protected void onDraw(canvas canvas){ super.onDraw();}protexted void dispatchDraw(Canvas canvas){ super.dispatchDraw(canvas);}可见上述...原创 2019-06-24 21:09:04 · 2384 阅读 · 1 评论 -
测量与布局
ViewGroup的绘制流程绘制流程分为三步:测量、布局、绘制,分别对应onMeasure(), onLayout(),onDraw()onMeasure():测量当前控件的大小,为正式布局提供建议(只是建议,至于上是否适用,要看onLayout()函数onLayout():使用layout()函数对所有子控件进行布局onDraw():根据布局的位置绘图onMeasure()函数与M...原创 2019-07-08 17:59:20 · 304 阅读 · 0 评论 -
SurfaceView使用与双缓冲技术
为什么引入SurfaceViewAndroid屏幕刷新时间是16ms, 如果View在16ms内完成所需要执行的绘图操作,那么在视觉上,界面是流畅的,否则就会出现卡顿,View,ViewGroup,Animator的代码执行全部是在主线程中完成的,当执行大量逻辑代码的时候,轻则卡顿,甚至会发生ANR问题,所以一般会使用Handler和AsyncTask,但是同时也会加大代码的复杂度,为了解决逻...原创 2019-07-02 21:29:19 · 733 阅读 · 0 评论 -
Canvas与图层(三)恢复画布
恢复画布有两个函数:restore()与rest无论哪种* 恢复画布有两个函数:restore()与restongoCount()restore()就是把回退栈中的最上层画布状态出栈,恢复画布状态,具体使用restoreToCount(int count)public int save();public int save(int saveFlags)public int saveLa...原创 2019-06-26 13:38:01 · 610 阅读 · 0 评论 -
Drawable与Bitmap详解
Drawable与Bitmap对比定义对比:Bitmap:称作位图,一般的位图的文件格式扩展名为.bmp,当然编码器也有很多,RGB565,RGB8888,作为一种追个像素的显示对象,执行效率高,但是存储效率低,可以理解成一种存储对象Drawable:Android下的通用的图片形象,它可以装载常用格式的图像,比如GIF,PNG,JPG,BMP,提供一些高级的可视化方法。属性对比:...原创 2019-06-29 21:45:53 · 4090 阅读 · 0 评论 -
BitmapFactory.Options参数作用
参数作用BitmapFactory.Options这个参数可以设置Bitmap的采样率,通过该比那图片的宽度、高度、缩放比例等,以达到减少图片的像素的目的,设置这个值可以更好的控制、显示和使用Bitmap,可以使用该值降低OOM出现的概率BitmapFactory.Options的常用成员变量(in开头的就是设置参数,out开头的就是获取参数):public boolean inJust...原创 2019-06-30 15:37:11 · 1227 阅读 · 0 评论 -
Drawable与Bitmap相互转换
Bitmap和Drawable区别在进行两者的转换之前我们需要了解:Biamap与Drawable的区别Biamap转换为DrawableBitmap转换为DrawableDrawable bitmapDrawable = new BitmapDrawable(bitmap);imageView.setBackground(bitmapDrawable);Drawable转换...原创 2019-08-17 10:06:33 · 413 阅读 · 0 评论 -
低像素Bitmap圆形头像实现边缘锐化
问题在项目中从存储设备中读取出的低像素Bitmap(圆形头像,在实现圆形切割的时候出现边缘模糊的情况,在尝试普通的圆形头像实现方法的过程中,发现平时使用的圆形头像方法并不生效,觉得可能是因为画布拉伸,所以在拉伸的画布上面进行绘制Circle的时候得到的也是低像素的圆形下面是平时使用的画原型头像的方法:public class Demo01Activity extends AppCompa...原创 2019-08-03 22:13:04 · 606 阅读 · 1 评论 -
Window与WindowManager
WindowWindow表示窗口,比如可以实现桌面或者锁屏上的类似悬浮窗的效果,Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast,实际上他们都是附加在Window上的,WindowManager提供了对这些Window的统一管理功能Window与WindowManager的联系为了分析Window的工作机制,需要先了解如何使用W...原创 2019-07-21 17:15:53 · 171 阅读 · 0 评论 -
控件的高级属性(二)
GestureDetector.SimpleOnGestureListener类首先它是一个类,在他的基础上新建类,要使用ectends派生 ,而不能用implements继承在其中的方法并不需要全部进行重写,需要什么就可以直接重写什么eg:public class SimpleOnGestureListenerActivity extends AppCompatActivity im...原创 2019-07-21 16:03:29 · 164 阅读 · 0 评论 -
CircleImageView的使用
简介:实现对一个图片进行圆形切割,并作为头像使用,因为在使用的过程中涉及备份到云端,那么就会出现重新加载的图片出现毛边,为了解决毛边的问题,在头像的周围添加一个圆框即可,在github上有一个开源控件叫做CircleImageView可以很好的实现圆形边框使用:在build.gradle的dependencies中加入dependencies { .... impl...原创 2019-07-21 14:43:36 · 1603 阅读 · 0 评论 -
控件的高级属性(一)
手势检测当用户触摸屏幕的时候,会产生很多的手势,如up,down,scroll, fling等处理简单的手势:View类有一个View.onTouchLiatener内部接口,通过重写他的onTouch(View view, MotionEvent event)函数,可以处理一些touch事件,但是这个函数只限于处理简单手势处理复杂手势:Android SDK提供给我们...原创 2019-07-15 23:06:35 · 152 阅读 · 0 评论 -
封装自定义控件
自定义属性与自定义Style利用XML中的declare-styleable标签来实现自定义属性,下面是declare-styleable标签的使用方法:自定义控件的步骤自定义一个类MyTextViewimport android.content.Context;import android.widget.TextView;/*** Created with Android ...原创 2019-07-05 21:14:04 · 467 阅读 · 0 评论 -
Bitmap静态方法
Bitmap静态创建方法static Bitmap createBitmap(int width, int height, Bitmap.Config config);static Bitmap createBitmap(Bitmap src);static Bitmap createBitmap(Bitmap source, int x, int y, int width, int hei...原创 2019-07-01 15:42:00 · 318 阅读 · 0 评论 -
混合模式(二)
PorterDuffXfermode该模式针对的时在处理结果时以源图像显示为主的模式,主要有:Mode.SRC, Mode.SRC_IN, Mode.SRC_OUT, Mode.SRC_OVER和Mode.SRC_ATOPMode.SRC://全部以源图像进行显示[Sa, Sc]Mode.SRC_IN://透明度和颜色值都是通过乘以目标图像的像素得到的//利用这个特性可以实现...原创 2019-06-21 19:16:45 · 851 阅读 · 0 评论 -
Canvas与图层(二)画布与图层
图层(Layer):每次调用canvas.drawXXX系列函数,都会生成一个透明图层来绘制这个图形画布(Bitmap):每块画布都是一个Bitmap,所有的图像都是画在这个Bitmap上的,画布有两种:* 一种是View的原始画布,通过onDraw(Canvas canvas)的方法传入的,canvas对应的就是原始的画布,控件的背景就是华仔这块 画布上的* 另一种是人造画布,通...原创 2019-06-25 14:49:49 · 3285 阅读 · 0 评论 -
ArgbEvaluator使用
上次提到IntEvaluator和FloatEvaluator,除了这两种Evaluator外,android.animation包下还有另外一个Evaluator, 名字为ArgbEvaluator,它是用来实现颜色值过度转换的。private void doAnimator(){ final ValueAnimator valueAnimat...原创 2019-05-28 21:32:48 · 949 阅读 · 0 评论 -
Android控件的使用
通过前面的学习可以看到自定义一个View的时候,继承View的时候,必须实现一个构造函数,但是有三个构造函数,每一个构造函数都是在特定的场景下所必须实现的,否则会报inflate的错误那么应该如何选择public RegionTest(Context context) { super(context);}public RegionTest(C...原创 2019-05-18 15:18:19 · 156 阅读 · 0 评论 -
ObjectAnimator使用
上次学习了ValueAnimator,但是ValueAnimator只能对动画中的数值进行计算,如果那个控件执行操作,就要实现对该对象的监听,相比于补间动画比较繁琐为了使动画直接与对应的控件相关联,以使我们从监听动画过程中解放出来,Google工程师在ValueAnimator的基础上派生了一个类ObjectAnimator,派生类的特性相信大家都知道。但是ObjectAnimator也重写...原创 2019-05-30 12:45:09 · 298 阅读 · 0 评论 -
Android文字与画布(二)
画布:Canvas平移:translate()使用来实现画布平移的,向右是X轴正方向,向下是Y轴正方向,画布的原点是(0,0)平移后的画布的左上角是新的坐标原点void translate(float dx, float dy)@Overrideprotected void onDraw(Canvas canvas){ super.onD...原创 2019-05-18 11:05:28 · 180 阅读 · 0 评论 -
Android视图动画--逐帧动画
逐帧动画:逐帧动画就是一帧挨着一帧,既可以通过XML实现,也可以通过Java代码实现使用XML实现动画文件:定义XML动画文件:*<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> ...原创 2019-05-22 21:42:04 · 180 阅读 · 0 评论 -
Android视图动画--插值器
动画速率的控制:Interpolator(指定动画变化的量)使用插值器:在xml文件中引用插值器通过setInterpolator()函数设置插值器AccelerateDecelerateInterpolator是加速减速插值器,表示在开始与结束的地方速率改变比较慢,在中间的时候加速,先加速后减速TranslateAnimation translateAnimatio...原创 2019-05-22 21:37:22 · 248 阅读 · 0 评论 -
自定义插值器与Evaluator
在视图动画中仅仅允许我们使用setInterpolator()函数来设置插值器,但是对于Animator来说,不仅可以设置插值器,还可以设置Evalator(差值器)比如刚才我们定义的ofInt(0,400)那么他的移动速度是通过什么来设置的呢,插值器就是用来控制动画的区间值如何被计算出来的系统自带的匀速插值器:public class LinearInterpolator implem...原创 2019-05-25 14:55:04 · 216 阅读 · 0 评论 -
Andorid自定义动画 文字与画布(一)
Paint设置//设置画笔宽度paint.setStrokeWidth(5);//指定抗锯齿功能paint.setAntiAlias(true);//绘图样式paint.setStyle(Paint.Style.FILL);//设置文字对齐方式paint.setTextAlign(Align.CENTER);//设置文字大小paint.setTextSize(12);//...原创 2019-05-16 12:15:27 · 210 阅读 · 0 评论 -
属性动画
视图动画与属性动画的区别:引入时间不同视图动画API1引入发,属性动画在API11所在包名不同视图动画:android.view.animation属性动画:android.animation动画类名不同视图动画:XXXXAnimation属性动画:XXXXAnimator视图动画我们可以发现如果给TextView设置一个向下移动的效果,在给他一个点...原创 2019-05-24 17:56:57 · 461 阅读 · 0 评论 -
Android自定义View基础
就像平时一样画图需要纸和笔android中Paint类就是画笔,而Canvas类就是纸(画布)所以可以得知笔的属性就是在paint类中设置画出的形状就会在 canvas中进行绘制首先实现一个自定义动画–画圆:package com.example.adminstator.myviewdesign.PaintBasic;import android.conte...原创 2019-04-29 21:46:43 · 157 阅读 · 0 评论 -
SVG动画
SVG简介什么是SVG:SVG矢量动画机制,Google在Android 5.x版本中增加了对SVG的支持SVG特性:可伸缩矢量图形定义用于网络的矢量图形使用XML格式定义图形图像在放大或改变尺寸的情况下其图形质量不会有所损失符合万维网联盟标准与注入DOM和XSL之类的W3C标准是一个整体Bitmap和SVG图像的区别:Bitmap是位图,由像素点组成,放大...原创 2019-06-12 16:53:26 · 1098 阅读 · 0 评论 -
绘图进阶(二)
BlurmaskFliter发光效果与图片阴影引入:有了之前的阴影基础可以很快的上手发光部分,但是有以下几点特点需要先了解:发光效果也是用高斯模糊算法,只会像阴影一样影响边缘,内部图像不受影响无法指定特定的发光颜色,采用边缘模糊效果进行模糊发光,边缘是什么颜色,发光是什么颜色概述:1.setMskFilter()函数的使用(注意使用前关闭硬件加速)://MaskFilter没有具...原创 2019-06-18 21:40:55 · 343 阅读 · 0 评论 -
绘图进阶(一)
贝济埃曲线Path中有很多函数,但是除了一些简单的设置和绘图用法之外,还有一个贝济埃曲线,它可以利用moveTo、LineTo连接的生硬路径边的平滑,也能实现像水波纹那样的效果一阶贝济埃曲线公式:P0表示起始点,P1表示终点,t表示当前时间,B(t)表示结果值,曲线的意义在于随着时间的变化,B(t)所形成的轨迹,可以理解为在起始点和终点之间形成在直线上匀速移动的点B(t) = (1-t...原创 2019-06-16 21:29:57 · 215 阅读 · 0 评论 -
Animator动画的XML实现
animator标签的字段animator标签说明android:duration每次动画播放的时长android:valueFrom初始动画值,取值范围为float、int和color这三种类型的值android:valueTo动画结束值,取值范围同样是int float color三种类型的值android:startOffset动画激活延时...原创 2019-06-04 18:25:49 · 248 阅读 · 0 评论 -
Android自定义动画--放射菜单
首先计算角度的问题比如这次使用的是5个图标的动画,那么90度分为4份,那么每份为22度这样可以看出每个圆形图片x方向移动了radius* sin22, y方向移动了radius * cos22Java中求正余弦//其中的degree为弧度值Math.sin(double degree);Math.cos(double degree);Math.tan(double...原创 2019-06-04 17:58:55 · 611 阅读 · 0 评论 -
混合模式(一)
混合模式混合模式能够将两个图片无缝结合,实现两张图片融合的效果,它是通过Paint类中的Xfermode setXfermode(Xfermode xfermode)函数实现的,Xfermode是一个空类和之前一样都是通过自类来实现不同的功能,子类有AvoidXfermode, PixelXorXfermode和PorterDuffXfermode由于PixelXorXfermode在API...原创 2019-06-20 16:38:47 · 1463 阅读 · 0 评论 -
AnimatorSet组合动画
看了ValueAnimator和ObjectAnimator,他们只能实现一个动画,如果我们想使用一个组合动画,就需要用到AnimatorSet一般而言我们不会使用ValueAnimator,只会使用ObjectAnimator组合动画实现在AnimatorSet中提供了两个函数:playSequentially()和playTogether(),前者表示所用动画依次播放,后者表示...原创 2019-06-04 15:32:21 · 743 阅读 · 0 评论 -
绘图进阶(三 )
Shader之LinearGradient通过LinearGradient实现线性渐变效果构造函数:1.指定两种颜色之间的渐变//(x0, y0)渐变的起始点坐标,(x1,y1)渐变的终点坐标//color0起始颜色//color1终止颜色//tile:用于指定当控件区域大于指定的渐变区域时的填充模式public LinearGradient(float x0, float y...原创 2019-06-19 19:33:48 · 162 阅读 · 0 评论