转载请注明出处:王亟亟的大牛之路

上周5因为要出去玩所以礼拜4基本没干活然后写了个垃圾桶的demo觉得蛮好玩的,准备做的深一点,但是文章还是一篇一篇发,省的有些小伙伴搞不清楚实现

还是先安利,地址如下:https://github.com/ddwhan0123/Useful-Open-Source-Android 最近把Rx和下拉刷新做了细分,方便大家查”裤”

先看下运行效果

就是一个垃圾桶然后用户点击按钮之后 盖子盖上去(可以用到项目里那种拖动到垃圾桶删除的效果)


首先讲下实现思路

首先我在https://icomoon.io/app/#/select里找了个垃圾桶的icon然后照着那个样子考虑我该怎么画(这网站还是不错的,不过现在都用iconfont了吧?)

因为 垃圾桶的桶身部分是不需要动画的,所以就先画桶身再画桶盖,桶盖用ValueAnimator解决旋转问题就好了


知识点

要画自定义控件,首先要知道view的绘画流程,具体理论知识就不说了以前说过,这里再点下
要自定义View 你要先实现onMeasure再是onDraw

onMeasure决定尺寸 onDraw决定具体ui展现

如果你是viewgroup的话还需要再实现onLayout来操作子视图间的位置关系


安卓的坐标系,跟我们数学的数轴不太一样,数轴有4个象限,而安卓只有一个。

屏幕左上角为(0,0)点,那右下角必然是最大点了。

越向右 x越大,越向下y越大。

ok,简单的道理讲完了,就开始贴代码看吧


代码实现

public class GabageCan extends View {private Paint paint;private Path path;private int viewWidth, viewHeight, picWidth, picHeight;private Float canBAnimProgress;private ValueAnimator animator;public GabageCan(Context context, AttributeSet attrs) {super(context, attrs);init();}public GabageCan(Context context) {super(context);init();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint.setColor(getResources().getColor(R.color.colorAccent));//设置画笔paint.setStrokeWidth(5f);
//        canvas.drawColor(Color.WHITE);//创建下半部分的路径和三条线createCanBPath();//画路径和线canvas.drawPath(path, paint);//动画判断是否刷新视图if (animator != null && animator.isRunning()) {//动画执行过程中具体帧值canBAnimProgress = (Float) animator.getAnimatedValue();drawCan(0, canvas);drawCan(1, canvas);drawCan(2, canvas);invalidate();} else if (animator != null && !animator.isRunning()) {drawCan(1, canvas);drawCan(2, canvas);}}public void startAnimator() {animator = ValueAnimator.ofFloat(1f, 0f);animator.setDuration(2000);animator.start();invalidate();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int width = getMySize(100, widthMeasureSpec);int height = getMySize(100, heightMeasureSpec);if (width < height) {height = width;} else {width = height;}setMeasuredDimension(width, height);Log.d("--->", "width " + width + " height " + height);viewWidth = width > 0 ? width : 0;viewHeight = height > 0 ? height : 0;if (viewWidth > 0) {picWidth = viewWidth / 3;}if (viewHeight > 0) {picHeight = viewHeight / 3;}}//初始化画笔private void init() {paint = new Paint();path = new Path();paint.setStyle(Paint.Style.STROKE);}private void drawCan(int type, Canvas canvas) {switch (type) {case 0:canvas.rotate(canBAnimProgress * 30, viewWidth / 2 + (picHeight / 2), viewHeight / 2 - (picWidth / 2));break;case 1:canvas.drawLine(viewWidth / 2 - (picWidth / 2) - 20, viewHeight / 2 - (picWidth / 2) - (picHeight / 8),viewWidth / 2 + (picHeight / 2) + 20, viewHeight / 2 - (picWidth / 2) - (picHeight / 8), paint);break;case 2:canvas.drawRect(viewWidth / 2 - (picWidth / 9), viewHeight / 2 - (picWidth / 2) - (picHeight / 4), viewWidth / 2 + (picHeight / 9),viewHeight / 2 - (picHeight / 2) - (picHeight / 8), paint);break;case 3:break;}}private void createCanBPath() {if (path == null) {path = new Path();}//画轮廓path.moveTo(viewWidth / 2 - (picWidth / 2), viewHeight / 2 - (picWidth / 2));path.lineTo(viewWidth / 2 - (picWidth / 3), viewHeight / 2 + (picHeight / 2));path.lineTo(viewWidth / 2 + (picHeight / 3), viewHeight / 2 + (picHeight / 2));path.lineTo(viewWidth / 2 + (picHeight / 3), viewHeight / 2 + (picHeight / 2));path.lineTo(viewWidth / 2 + (picHeight / 2), viewHeight / 2 - (picWidth / 2));//画里面的竖线path.moveTo(viewWidth / 2 - (picWidth / 5), viewHeight / 2 - (picWidth / 3));path.lineTo(viewWidth / 2 - (picWidth / 5), viewHeight / 2 + (picHeight / 3));path.moveTo(viewWidth / 2 + (picWidth / 5), viewHeight / 2 - (picWidth / 3));path.lineTo(viewWidth / 2 + (picWidth / 5), viewHeight / 2 + (picHeight / 3));path.moveTo(viewWidth / 2, viewHeight / 2 - (picWidth / 3));path.lineTo(viewWidth / 2, viewHeight / 2 + (picHeight / 3));}private int getMySize(int defaultSize, int measureSpec) {int mySize = defaultSize;int mode = MeasureSpec.getMode(measureSpec);int size = MeasureSpec.getSize(measureSpec);switch (mode) {case MeasureSpec.UNSPECIFIED: {//如果没有指定大小,就设置为默认大小mySize = defaultSize;break;}case MeasureSpec.AT_MOST: {//如果测量模式是最大取值为size//我们将大小取最大值,你也可以取其他值mySize = size;break;}case MeasureSpec.EXACTLY: {//如果是固定的大小,那就不要去改变它mySize = size;break;}}return mySize;}
}

整体实现不难,只是提供个思路吧,写着玩,哈哈哈哈

源码地址:https://github.com/ddwhan0123/BlogSample/blob/master/GabageCan.class

之后可能写个拽入垃圾桶的动画,到时候再说吧。。。

写一个垃圾桶开关盖子的动画其实很简单相关推荐

  1. 写一个把控件丢到垃圾桶的动画其实很简单

    转载请注明出处:王亟亟的大牛之路 上次写了个垃圾桶开盖打demo,然后说要再写一篇往垃圾桶丢垃圾的demo,延期了一礼拜今天终于逼着自己补完了. 还是老规矩,先安利: https://github.c ...

  2. 如果写一个点击view带动画的下滑展开显示隐藏内容的控件

    原理是在onMeasure中得到隐藏内容的高度,点击这个view的时候对隐藏的view startAnimation,让它的高度从0增长到onMeasure得到的这个View的measureHeigh ...

  3. Python写一个自动发送直播弹幕的工具,非常简单

    哈喽大家好,今天给大家用Python整一个可以在直播间自动发弹幕的工具,来为喜欢的主播疯狂扣6 ! 事情原由昨晚回家,表弟在看LOL直播,看得我气不打一处来,差点就想锤他. 身为程序员的表弟,看直播发 ...

  4. 网友:Java岗,自学一个月跳槽计算机视觉,其实入门很简单

    笔者在脉脉上看到一条帖子:原来Java岗,自学一个月成功跳槽视觉算法岗. 这已经不是笔者第一次看到转行成功的程序员案例了,而大家的跳槽动机基本上都离不开,发展趋势.岗位高薪.职业兴趣. 计算机视觉 行 ...

  5. 神奇:运用Python实现一个猜测心中数字的”魔术“方法很简单。

    # -*- coding = utf-8 -*- # @Time :2021/10/9 18:53 # @Author : 程大仙 # @File :PYTHON 1 .py # @software: ...

  6. c语言特征码搜索,[原创]一个速度不是很快但是逻辑很简单的内存特征码搜索

    // ConsoleApplication8.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // 很多头文件不需要,你自己看着用吧 我是复制我之前的 # ...

  7. java 同步锁_死磕 java同步系列之自己动手写一个锁Lock

    问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...

  8. 听说你要找前端工作,写一个酷炫的动画的简历呗

    ###DEMO ###源码 gihub 求star 求fork DEMO 预加载需要改一下,因为我放在服务器上的 所以是http请求 但是 在本地 就成了 file 请求 所以 各位自己改一下 如果 ...

  9. 从零开始写一个武侠冒险游戏-3-地图生成

    2019独角兽企业重金招聘Python工程师标准>>> 从零开始写一个武侠冒险游戏-3-地图生成 概述 前面两章我们设计了角色的状态, 绘制出了角色, 并且赋予角色动作, 现在是时候 ...

最新文章

  1. 如何查看linux动态链接库文件的版本等其他信息
  2. Win7访问局域网内共享文件夹
  3. vue父子组件、兄弟组件之间的通信和访问
  4. Hybrid-APP技术原理
  5. 进程与服务的签名_苹果app签名需要注意哪几点
  6. 通俗解释glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用 (
  7. 线程池中线程抛了异常如何处理?
  8. 【英语学习】【WOTD】resurrection 释义/词源/示例
  9. java机器PDF_机器人制作入门(第3版)PDF 下载
  10. Python 正则表达式(二)
  11. 用python画简单的图案-使用 Python Turtle 设计简单而又美丽的图形
  12. 13、MVC 设计思想
  13. 一款原型设计软件——墨刀的介绍
  14. 反射机制——获取Class中的方法
  15. c语言实例100_pic单片机,PIC单片机C语言编程实例
  16. java电子贺卡_基于JAVA WEB的电子贺卡,请帖制作系统
  17. 计算机电子贺卡制作圣诞节,如何制作电子圣诞贺卡?贺卡制作步骤
  18. 刀刀漫画合集(共享PDF,RAR,UMD版本和语录)
  19. 解决Ubuntu强制获取root权限后只剩下客人会话而无法正常登录
  20. 谷歌浏览器禁止打开某些网站

热门文章

  1. activitygroup activity 启动时白屏、黑屏
  2. matlab中的simulink仿真中的scope图或者figure中的图进行编辑,然后添加文字并旋转,添加网格等
  3. msvcr120.dll丢失如何修复?msvcr120.dll丢失修复方法
  4. Tomcat配置https(jks证书请求)
  5. Android之制作短信发送器
  6. python要装在虚拟机吗_学python必须装虚拟机吗
  7. 两台电脑最简单的连接方法,实现文件互传,速度非常快
  8. android layoutinflater用法,Android LayoutInflater的用法详解
  9. Pytorch:Transformer(Encoder编码器-Decoder解码器、多头注意力机制、多头自注意力机制、掩码张量、前馈全连接层、规范化层、子层连接结构、pyitcast) part1
  10. EXCEL-AVERAGE函数使用方法