定制自己的动画 View 控件(Canvas 使用)

如果要定义自己的 View 控件,则需要新建一个类继承 android.view.View。然后在 onDraw 中写自己需要实现的方式。

这里定制了一个非常简单的动画,让 Android Studio 默认工程的圆形 logo 沿着对角线运动,且运动过程中进行旋转。

以下为具体步骤:

  1. 新建工程,从 mipmap 下复制一个 ic_launcher_round.png 到 drawable 目录下

  2. 新建一个类,继承自 View,这里命名为 MyView,需要注意,它的构造函数需要选择 2 个形参的

private Resources mResources;
private Paint mPaint;
private Bitmap mBitmap;
private int mBitmapHeight;
private int mBitmapWidth;
private int mViewHeight;
private int mViewWidth;
private int x;
private int y;
private int rotation;
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mResources = getResources();
initPaint();
initBitmap();
x = mViewWidth;
y = mViewHeight;
rotation = 0;
}
private void initPaint() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setFilterBitmap(true);
} private void initBitmap() {
mBitmap = ((BitmapDrawable)mResources
.getDrawable(R.drawable.ic_launcher_round,null))
.getBitmap();
mBitmapHeight = mBitmap.getHeight();
mBitmapWidth = mBitmap.getWidth();
}
  1. 重写 onDraw 方法
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); // canvas.drawBitmap(mBitmap,0,0,mPaint); /**
* 不旋转画布的方式
* 位置 A 和 位置 B 不重叠,位置 B 和位置 C 重叠
* 说明位置 A 的图形恢复完成后,已经主动将画布恢复现场,则save()和restore()方法本身并没有什么用
*/
// canvas.save();
// Matrix matrix = new Matrix();
// matrix.postTranslate(x,y);
// matrix.postRotate(rotation,x + mBitmapWidth / 2,y + mBitmapHeight / 2);
// 这里按照网络上的说法,画布已经经过了移动和旋转
// 位置 A
// canvas.drawBitmap(mBitmap,matrix,mPaint);
// 位置 B
// canvas.drawBitmap(mBitmap,0,0,mPaint);
// canvas.restore();
// 位置 C
// canvas.drawBitmap(mBitmap,0,0,mPaint); /**
* 旋转画布的方式
*/
canvas.save();
// 画布的原点移动到了(x,y)点 --> (x,y)->(0,0)
canvas.translate(x,y);
// 画布在(0,0)点进行了旋转,旋转角度是 rotation,旋转的中心点是(mBitmapWidth/2,mBitmapHeight/2)
canvas.rotate(rotation,mBitmapWidth / 2,mBitmapHeight / 2);
// 在(0,0)点绘制需要的图形
canvas.drawBitmap(mBitmap,0,0,mPaint);
// 将画布恢复
canvas.restore();
// 还是用之前的语句再绘制需要的图形
canvas.drawBitmap(mBitmap,0,0,mPaint); // 图形不重叠 x++;
y++;
rotation+=1;
if (x > mViewWidth - mBitmapWidth || y > mViewHeight - mBitmapHeight) {
x = 0;
y = 0;
} postInvalidate(); // 这句话将会调用 onDraw(),也就是说,这个函数陷入死循环
}

定制自己的动画 View 控件(Canvas 使用)的更多相关文章

  1. Android 自定义View修炼-打造完美的自定义侧滑菜单/侧滑View控件

    一.概述 在App中,经常会出现侧滑菜单,侧滑滑出View等效果,虽然说Android有很多第三方开源库,但是实际上 咱们可以自己也写一个自定义的侧滑View控件,其实不难,主要涉及到以下几个要点: ...

  2. Android 打造完美的侧滑菜单/侧滑View控件

    概述 Android 打造完美的侧滑菜单/侧滑View控件,完全自定义实现,支持左右两个方向弹出,代码高度简洁流畅,兼容性高,控件实用方便. 详细 代码下载:http://www.demodashi. ...

  3. 旋转动画用控件RotateView

    旋转动画用控件RotateView 最终效果: 源码: RotateView.h 与 RotateView.m // // RotateView.h // RotateAnimationView // ...

  4. iOS开发UI篇—使用picker View控件完成一个简单的选餐应用

    iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...

  5. Scroll View 控件以Thumbnail的方式显示一个目录的全部图片,相似图片浏览器

    MAC : XCode -> Scroll View 控件以Thumbnail的方式显示一个目录的全部图片,类似图片浏览器 STEP1:将两个目录复制到project里面ImageBrowser ...

  6. 重新想象 Windows 8 Store Apps (7) - 控件之布局控件: Canvas, Grid, StackPanel, VirtualizingStackPanel, WrapGrid, VariableSizedWrapGrid

    原文:重新想象 Windows 8 Store Apps (7) - 控件之布局控件: Canvas, Grid, StackPanel, VirtualizingStackPanel, WrapGr ...

  7. 巧用Handler获取View控件信息

    众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放.大小控制并非是xml类型的layout文件完全可以搞定的.此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放 ...

  8. Android开发技巧——定制仿微信图片裁剪控件

    拍照--裁剪,或者是选择图片--裁剪,是我们设置头像或上传图片时经常需要的一组操作.上篇讲了Camera的使用,这篇讲一下我对图片裁剪的实现. 背景 下面的需求都来自产品. 裁剪图片要像微信那样,拖动 ...

  9. Android自定义view控件

    转载自: http://blog.163.com/ppy2790@126/blog/static/103242241201382210910473/ 开发自定义控件的步骤: 1.了解View的工作原理 ...

随机推荐

  1. ubuntu 安装linux 下vmVMware tools 步骤及问题解决

    一. 菜单栏     “虚拟机” ——> “设置 ”     使用linux.so镜像文件    此文件在vmware workstation 的安装目录.并且打开CD/DVD的连接. 二.终端 ...

  2. JavaScript碎片———函数闭包(模拟面向对象)

    经过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,JavaScript语言本身是没有面向对象的,但是那些大神们却深深的模拟出来了面向对象,让我震撼不已.本篇博客就是在此基础上加上自己的认知, ...

  3. css动画Demo---水波动画和边框动画

    先上效果图: 水波动画: 边框动画: 1.水波动画 实现代码 <!DOCTYPE html> <html lang="en"> <head> & ...

  4. R语言学习笔记—组合数

    组合数:从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数. 代码: str_comb <- function(vector){ n <- l ...

  5. python 多线程笔记(1)-- 概念

    本文对不使用线程和使用线程做了一个对比. 假设有两件事情:听歌.看电影 一.不用线程 import time songs = ['爱情买卖','朋友','回家过年','好日子'] movies = [ ...

  6. MySQL入门篇(四)之MySQL主从复制

    一.MySQL主从复制原理 随机站点访问量的鞥集啊,单台的MySQL服务器压力也不断地增加,此时需要对MySQL进行优化,如果在MySQL优化无明显改善时期,可以使用高可用.主从复制.读写分离.分库分 ...

  7. .NET Core单元测试之搞死开发的覆盖率统计(coverlet + ReportGenerator )

    .NET Core单元测试之搞死开发的覆盖率统计 这两天在给项目补单元测试,dalao们要求要看一下测试覆盖率 翻了一波官方test命令覆盖率倒是有支持了,然而某个更新日志里面写着 ["Su ...

  8. springmvc @Valid 接收实体类时出现bean为null的问题

    这是因为传到后端之后,全部以全小写形式处理了 所以前端也需要把name设置为全小写,否则后端不识别,导致接收不到,导致为null

  9. JS基础,课堂作业,健康体重评估

    健康体重评估 <script> var sex = prompt("请输入性别:"); var height = parseInt(prompt("请输入身高 ...

  10. 订单号生成逻辑,C#和JAVA双版

    五年没写过博客了,倒是天天在看 转来转去,又转回技术 原来一直在使用微软爸爸的东西,最近一两年开始玩android,玩java,还有PostgreSQL 都有些应用了,倒是可以整理些随笔出来,这就是其 ...