android 自定义view
chsmy2018
学无止境,任何技能都是慢慢积累出来的。
展开
-
Andorid加载大图,双击放大,手势缩放
Android开发中,有时候会有加载巨图的需求,如何加载一个大图而不产生OOM呢,使用系统提供的BitmapRegionDecoder这个类可以很轻松的完成。效果图:BitmapRegionDecoder:区域解码器,可以用来解码一个矩形区域的图像,有了这个我们就可以自定义一块矩形的区域,然后根据手势来移动矩形区域的位置就能慢慢看到整张图片了。OK 核心原理就是这么简单,不过做起来还是有一...原创 2019-12-20 21:00:43 · 398 阅读 · 0 评论 -
Canvas和属性动画实现好看的效果
最终效果如下图实现步骤:绘制6个小圆圈,小圆圈是围绕着一个大圆平均绘制的,我们可以计算大圆的总弧度,然后除以小圆的个数,就能得到每个小圆之间间隔的弧度。然后循环绘制 private void drawSmallCircle(Canvas canvas) { canvas.drawColor(Color.WHITE); //一个完整的圆的弧度是2π,计...原创 2019-03-30 18:34:05 · 1273 阅读 · 0 评论 -
QQ红点拖拽效果
今天来做一下QQ列表上的红点拖拽效果思路:首先我们得给小圆点定义一些状态,默认状态,手指点上去的状态,手指一动时的状态,手指松开时的状态。在onTouchEvent方法中更新状态值,最后在onDraw中根据不同的状态值绘制圆和path。思路很简单,就是绘制的时候我们需要把中学时候学的几何数学拿来用一下啦。先定义一些成员变量,把状态啊,画笔啊,半径啊,原点等都初始化好然后在开始,具体可以到最下面...原创 2019-03-30 18:36:00 · 669 阅读 · 0 评论 -
UI绘制流程--View 是如何被添加到屏幕上的
我们平时打开一个activity的时候,设置我们的视图都是在onCreate的setContentView方法开始,那我们就从这个方法开始看源码。这里我们继承的是AppCompatActivity public void setContentView(@LayoutRes int layoutResID) { this.getDelegate().setContentView(...原创 2019-03-24 12:18:05 · 516 阅读 · 0 评论 -
UI绘制流程--View的绘制流程
上一篇UI绘制流程–View是如何被添加到屏幕上的我们学习了View是怎么添加到屏幕上的,这一片来学习View绘制流程,它的入口在入口ActivityThread.handleResumeActivity()。本篇基于9.0的源码以前的一篇文章 Activity启动流程,最后我Activity启动的最后走到了ActivityThread中执行handleResumeActivity方法并里面执行...原创 2019-03-24 12:18:55 · 170 阅读 · 0 评论 -
Android事件分发机制
想要了解Android的事件分发机制,首先需要知道事件是从哪里开始的。从之前的一篇文章View是如何被添加到屏幕上的的最后一幅图,可以知道,我们打开一个界面后,界面的层级从顶层开始是Activity->PhoneWindow->DecorView->…所以当我们手指点击到屏幕上之后,事件的分发也是在Activity中开始。执行Activity中的dispatchTouchEv...原创 2019-03-31 22:17:30 · 153 阅读 · 0 评论 -
Android屏幕适配
Android屏幕适配这个东西,真是每个Andorid开发者从入行开始就比较关注也比较头疼的问题,从多套dimens到百分比布局再到鸿神的AutoLayout还有smallestWidth最小宽度限定符适配,还有的公司重写了系统常用的布局容器,然后在onMeasure中进行等比例的缩放。这些都能达到一些挺好的效果,不过也有不少bug存在,适配起来酣畅淋漓的感觉。后来有人想到了修改系统Densit...原创 2019-04-14 14:25:46 · 587 阅读 · 0 评论 -
Android刘海屏适配
刘海屏和水滴屏的手机目前市场上还是挺多的,所以如果有必要的话,我们开发者还是需要去适配一下。那什么情况下我们需要去适配这个刘海屏呢?如果App使用了沉浸式的状态栏,或者透明状态栏,我们自己的布局延伸到了状态栏内部,这时候如果我们在刘海处有一个可交互的控件就会被遮挡使用了全面屏的页面,比如APP的闪屏界面,图片查看大图的页面,这时候状态栏不可见,刘海会遮挡一部分地方。如果没有上面两种情况...原创 2019-04-14 14:27:01 · 493 阅读 · 0 评论 -
自定义ViewGroup练习之流式布局
自定义ViewGroup,写自己的View继承自ViewGroup,然后重写它的onMeasure和onLayout方法即可。onMeasure 测量阶段主要分3步循环调用子view的measure方法,测量子view的宽高并保存通过子view的宽高,来确定自己的宽高setMeasuredDimension()方法来保存自己的宽高计算子view的尺寸,需要通过父view的测量模式和大...原创 2019-04-14 14:34:36 · 274 阅读 · 0 评论 -
自定义控件神器--PathMeasure
我们平时自定义View的时候,经常会绘制path,想要求出path路径上的某个点的位置,很难通过一般的数学函数来计算,幸好系统给我们提供了一个PathMeasure可以用来测量一个path的路径,我们可以根据测量得到的值来绘制一些别的效果。PathMeasure有两个构造方法 public PathMeasure() { mPath = null; nativ...原创 2019-04-14 14:40:48 · 184 阅读 · 0 评论 -
自定义ViewGroup练习之仿写RecycleView
哈哈,标题很唬人,其实就是根据RecyclerView的核心思想来写一个简单的列表控件。RecycleView的核心组件回收池:可以回收任意的item控件,并可以根据需要返回特定的item控件。适配器:Adapter接口,帮助RecycleView展示列表数据,使用适配器模式,将界面展示跟交互分离RecycleView:主要做用户交互,事件触摸反馈,边界值的判断,协调回收池和适配器对象之...原创 2019-04-14 14:42:23 · 456 阅读 · 0 评论 -
理解属性动画从仿写开始
属性动画的本质:改变某一个View某一个时间点的属性值,比如一个View在0.1秒的时候在100px的位置,0.2秒的时候到了200px的位置,这就会让我们感觉到一个动画的效果,实际上就时每隔一段时间调用view.setX()方法。看一下系统属性动画的简单用法Button button = findViewById(R.id.button); ObjectAnimator animator...原创 2019-04-14 20:57:42 · 161 阅读 · 0 评论 -
粒子效果的实现
效果图想要实现一个图片的粒子效果,思路就是遍历图片的宽高,通过Bitmap.getPixel(row,cloum)这个方法,返回值我们可以拿到当前像素点的颜色值,我们也能拿到当前的坐标点,然后封装成一个一个的小球对象,保存在集合里面。在onDraw里面遍历集合根据这些小球的坐标点和颜色值绘制圆圈。如果我们取的像素足够密,绘制出来的原点可以组成这个图片。动画效果,通过属性动画,在onAn...原创 2019-03-30 18:31:10 · 616 阅读 · 0 评论 -
Xfermode实现刮刮卡
想要实现一个刮刮卡的效果,其中的一种方法就是使用图层混合模式Xfermode,想要很好的理解Xfermode,我们需要先结合着谷歌的例子来。官方的源码我们可以在这里获得 https://github.com/THEONE10211024/ApiDemos/blob/master/app/src/main/java/com/example/android/apis/graphics/Xfermod...原创 2019-03-30 18:29:28 · 253 阅读 · 0 评论 -
Android 自定义View练习之水波纹
今天看了网上的一个叫潭州学院的课程里的一个自定义View水波纹效果的视频。感觉效果不错,看完之后自己敲了一遍。先看一下效果 以前也曾想过做个类似的效果,但最终只是实现了一个的效果,多了的话怎么办呢,视频中提供了一个非常好的方法。根据面向对象的思想,将每个wave看成一个对象定义一个类: class Wave { Paint p; int原创 2016-01-14 15:16:47 · 872 阅读 · 0 评论 -
手撸一个Android柱形图和线型图的组合图表
项目开发中经常用到统计图表,网上也有很多的图表类库,我最常用的就是MPAndroidChart,这个库做的非常细致用起来也简单。还有一些别的库比如 XCL-chart,hellochart,等等。 但是用别人的东西好处就是快方便,坏处就是不好维护了,而且它们也只是实现了一些主流的效果,当我们面对产品经理天马行空的想法的时候,总有一些效果是这些库无法实现的。所以掌握Android中的一些绘原创 2016-07-08 14:23:57 · 3914 阅读 · 1 评论 -
自定义View签名画板并保存
项目中用到签名的功能。实现完记录一下。效果图:首先是签名的功能。原理很简单将我们手指一动的轨迹绘制出来就可以了。主要用到了canvas的绘制path的api。 canvas.drawPath(mPath,mPaint); 剩下的主要就是我们怎么确定path的轨迹。path轨迹的确定可以参考文章Path之贝赛尔曲线和手势轨迹、水波纹效果path的轨迹的确定无非就是 Path.moveTo(x,y)来原创 2016-09-18 10:52:59 · 3421 阅读 · 0 评论 -
手撸一个Android饼状图表
要完成一个饼状图,其实就是将一个360度分成很多份,然后每一份绘制一个扇形,这些扇形加起来正好是一个整圆。 效果: android中绘制扇形 我们可以用绘制弧形的apidrawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 也可以用绘制path的api canvas.draw原创 2016-09-20 17:07:02 · 8679 阅读 · 1 评论 -
Android自定义View直线比例图
项目中用到下面的效果: 总共有四种状态,分四种颜色,根据传入的每种状态的比例值在直线上显示各自的长度。这种效果最终用两种方法完成。第一种第一种方法是首先想到的一种方法,自定义一个FrameLayout,在里面有四个互相重叠的Imageview或者textview。背景使用shpe绘制四个圆角矩形。然后根据传入的值动态改变imageview或者textview的宽度shape:原创 2016-10-11 09:57:14 · 3571 阅读 · 0 评论 -
手撸一个Android饼状图表(空心圆)
以前写过一篇博客 手撸一个Android饼状图表 自定义view中绘制了一个饼状图。项目中我们还经常用到一些饼状图是空心的圆看起来也很好看。 OK 空心圆的饼状图怎么绘制呢 ,下面就把 手撸一个Android饼状图表改造一下有两种方法。 第一种 : 将画笔改为描边并且将画笔的宽度加粗。绘制扇形的时候useCenter参数改为false mPaint.setStrokeWidth原创 2017-02-27 14:34:20 · 3270 阅读 · 0 评论 -
自定义完成一个日历(二)
上一篇 自定义完成一个日历(一)写了一个简单的日历。只是简单的展示了日历和标识出当天。今天把上个日历控件优化一下。 优化点: (1)添加滑动功能,可根据滑动来切换月份 (2)增加点击事件和点击效果 (3)增加跳到今天 (4)增加按周切换的风格 效果图: 步骤: (1)将切换增加滑动切换功能,思路简单只需将以前显示日历的recycleview使用viewpager包起来就好啦。使用原创 2017-06-23 17:10:18 · 824 阅读 · 0 评论 -
自定义完成一个日历(一)
开发中经常用到日历控件,有时候系统的控件不能满足我们的需求,只能自己写一个啦,今天从头开始写一个日历控件。 效果图: 首先定义一个实体类保存每个日历单元的信息这里先保存最基本的年月日信息以后点击状态也可以保存在这里package com.chs.mycalender;/** * 作者:chs on 2017-06-20 11:09 * 邮箱:657083984@qq.com */publi原创 2017-06-21 14:40:13 · 1079 阅读 · 3 评论 -
手撸一个Android柱状图表
跟上一篇手撸一个线形图表 做法基本一样,柱形图主要是用到canvas的绘制矩形的api 。剩下的就是坐标的计算了。 (1) 按照自定义View的步骤,先重写他的几个构造方法。在构造方法中初始化我们需要用到的一些变量,画笔,path路径,间距,绘制柱形图的Rect等。 (2) 在onSizeChanged方法中初始化控件的宽和高,绘图区域的高度等尺寸值@Override prot原创 2016-09-08 14:42:55 · 1322 阅读 · 0 评论 -
手撸一个Android柱形图和线型图的组合图表
项目开发中经常用到统计图表,网上也有很多的图表类库,比如 :MPAndroidChart,XCL-chart,hellochart,AChartEngine等等,以前我最常用的就是MPAndroidChart,这个库做的非常细致用起来也简单。 但是用别人的东西好处就是快方便,坏处就是不好维护了,而且它们也只是实现了一些主流的效果,当我们面对产品经理天马行空的想法的时候,总有一些效果是这些库无法实原创 2017-11-16 15:00:39 · 1751 阅读 · 0 评论 -
手撸一个Android线形图表
手撸一个现形图表: 效果: 我们自定义一个View 实现起来还是很简单的就是使用canvas的绘制path的api。最主要的就是绘制的坐标的计算。 (1) 按照自定义View的步骤,先重写他的几个构造方法。在构造方法中初始化我们需要用到的一些变量,画笔,path路径,间距等。 (2) 在onSizeChanged方法中初始化控件的宽和高,绘图区域的高度等尺寸值 @Override原创 2016-09-07 17:51:43 · 2515 阅读 · 0 评论 -
Android自定义View之微信雷达
Android自定义View之微信雷达效果:gif图录制的好像有水印似的东西效果不好 真实运行效果更好没有那些水印制作步骤:先看住布局一个FrameLayout <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pare原创 2016-01-16 13:36:47 · 1045 阅读 · 0 评论