概述:

360安全卫士的那个刷新球(姑且叫它刷新球,因为真的不知道叫什么好,不是dota里的刷新球!!),里面像住了水一样,生动可爱,看似简单,写起来不太简单,本例程只是实现了它的部分功能而已,说实话,跟360的刷新球比起来差距还是很大,我这个长得有点挫。

本历程需要用到的知识包括:android的自定义View,自定义canvas、path、Bitmap、Handler

先结果演示:

Android自定义View之图形图像(模仿360的刷新球自定Damopublic class MyPathView extends View { private int width; private int height; private int progress; private int maxProgress = 100; private Path mPath; private Paint mPaintCircle; private Paint mPaintWave; private Paint mPaintText; private Bitmap mBitmapBubble; private Canvas mCanvasBitmap; private int size = 0;//水波动幅度 private int count;//水流动距离 private boolean isAdd = true; private static final int START_WAVE = 0x21; public int getProgress() { return progress; } public void setProgress(int progress) { this.progress = progress; invalidate(); } public int getMaxProgress() { return maxProgress; } public void setMaxProgress(int maxProgress) { this.maxProgress = maxProgress; } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case START_WAVE: count += 30; if (count >= 180) { count = 0; } if (isAdd) { size += 7; if (size > 41) { isAdd = false; } } else { size -= 7; if (size <= -41) { isAdd = true; } } invalidate(); sendEmptyMessageDelayed(START_WAVE, 100); break; } } }; public MyPathView(Context context) { super(context); } public MyPathView(Context context, AttributeSet attrs) { super(context, attrs); mPaintCircle = new Paint(); mPaintCircle.setStyle(Paint.Style.FILL_AND_STROKE); mPaintCircle.setColor(Color.argb(0X4f, 0x4d, 0x4d, 0xff)); mPaintText = new Paint(); mPaintText.setColor(Color.WHITE); mPaintText.setTextSize(50); mPaintText.setTextAlign(Paint.Align.CENTER); mPaintWave = new Paint(); mPaintWave.setColor(Color.argb(0xaa, 0xff, 0x7c, 0x00)); mPaintWave.setStyle(Paint.Style.FILL); //不显示非重叠部分,并且重叠部分显示自己 PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP); mPaintWave.setXfermode(mode); mPath = new Path(); handler.sendEmptyMessageDelayed(START_WAVE, 1000); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); setMeasuredDimension(width, height); mBitmapBubble = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); mCanvasBitmap = new Canvas(mBitmapBubble); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPath.reset(); //canvas.drawColor(Color.argb(0xaa, 0x88, 0x7e, 0x7f));//自定义颜色 mCanvasBitmap.drawCircle(width / 2, height / 2, 200, mPaintCircle); mPath.reset(); //用path圈出一个矩形,把水波和球的包含进去 mPath.moveTo(width / 2 + 200, height / 2 + 200 - progress / maxProgress * 400); mPath.lineTo(width / 2 + 200, height / 2 + 200); mPath.lineTo(0, height / 2 + 200); mPath.lineTo(0, height / 2 + 200 - progress / maxProgress * 400); /* 画一条个模拟流动的波浪 */ //当count增大时,重绘会显示向前流动效果,count的值不能大于width/2-200 mPath.lineTo(count, height / 2 + 200 -(float) progress / maxProgress * 400);// mPath.moveTo(count,200); //size的从大到小从小到大变化,重绘时会产生波浪起伏效果 for (int i = 0; i < 20; i++) { /* rQuadTo()方法每次都会自动移动到下一位置,参数依次为水平幅度, 垂直幅度,水平位移,处置位移 */ mPath.rQuadTo(20, size, 90, 0); mPath.rQuadTo(20, -size, 90, 0); } mPath.close(); mCanvasBitmap.drawPath(mPath, mPaintWave); canvas.drawBitmap(mBitmapBubble, 0, 0, null); //绘制文本,当前进度 canvas.drawText(progress*100/maxProgress+%,width/2,height/2,mPaintText); }}

主活动调用自定义View:public class MainActivity extends Activity { private int progress; private Button mButtonStart; private MyPathView myPathView; private static final int DOWNLOAD_UPDATE = 0x99; //模拟下载 private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); //处理msg switch (msg.what) { case DOWNLOAD_UPDATE: progress += 1; //当progress大于maxProgress时,不再调用一下方法 if (progress<=myPathView.getMaxProgress()){ myPathView.setProgress(progress);//设置新的进度 sendEmptyMessageDelayed(DOWNLOAD_UPDATE, 100);//每隔100毫秒发送一次handler } break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButtonStart = (Button) findViewById(R.id.button_start); myPathView = (MyPathView) findViewById(R.id.progress_view_first); mButtonStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //向handler发送一个延时空消息,1000毫秒后发送 mHandler.sendEmptyMessageDelayed(DOWNLOAD_UPDATE, 1000); } }); }}

内容由用户发布,不代表本站观点。如发现有害或侵权内容。请点击这里

android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定相关推荐

  1. android 自定义progressbar demo,Android自定义View――动态ProgressBar之模仿360加速球

    在之前一篇文章中我们讲解了三种ProgressBar的做法,详见-><Android 自定义View--自定义ProgressBar >.这一节中我们模仿360加速球制作一个动态Pr ...

  2. Android自定义View之图形图像(模仿360的刷新球自定义一个SeekBar)

    概述: 360安全卫士的那个刷新球(姑且叫它刷新球,因为真的不知道叫什么好,不是dota里的刷新球!!),里面像住了水一样,生动可爱,看似简单,写起来不太简单,本例程只是实现了它的部分功能而已,说实话 ...

  3. 用c语言绘制自定义图形,Android使用自定义View绘图

    使用自定义 View 绘图 实例 MyViewCanvasDemo 自定义一个名为 MyView 的 View 类,并在其 onDraw() 方法中绘制简单的图像,运行效果如图 1 所示. 图 1   ...

  4. Android App开发之自定义图形中位图与图形互转、剪裁图形内部区域、给图形添加部件的讲解及实战(附源码 简单易懂)

    需要图片和源码点赞关注收藏后评论区留言~~~ 一.位图与图形互转 Drawable用于在界面上展示图片,Bitmap用于加工图像数据,所以两者之间的转换非常有必要,位图图形BitmapDrawable ...

  5. android伸缩动画自定义,Android干货:自定义带动画的View

    对于一个自定义View来说,onMeasure只是用来计算View尺寸,onDraw()才是真正执行View的绘制,所以一般我们都需要重写onDraw()函数来绘制我们期望的UI界面,下面我以一个具体 ...

  6. android 自定义paint,Android自定义View中Paint、Rect、Canvas介绍(一)

    自定义View对于新手而言貌似是一个很复杂的东西.格式,各函数的意义.对于大神经常忘记各函数及一些参数的具体写法及意义,刚好在做一个风车效果,把过程及遇到的问题都写下来 1.如何自定义一个View p ...

  7. android canvas 手写,自定义view—Canvas实现手写板和涂鸦功能

    学习导航 第一节:http://blog..net/bobo8945510/article/details/53197727 -自定义View-自定义属性及引用 第二节:http://blog..ne ...

  8. android炫酷的自定义view,Android自定义View实现炫酷进度条

    本文实例为大家分享了Android实现炫酷进度条的具体代码,供大家参考,具体内容如下 下面我们来实现如下效果: 第一步:创建attrs文件夹,自定义属性: 第二步:自定义View: /** * Cre ...

  9. android组件什么时候加载到r文件,Android自定义加载loading view动画组件

    我写写使用步骤 自定义view(CircleProgress )的代码 package com.hysmarthotel.view; import com.hysmarthotel.roomcontr ...

最新文章

  1. datasnap發布
  2. thinkphp学习笔记13-15集
  3. MySQL数据库分表分区
  4. sainsbury online order
  5. VOA AGRICULTURE REPORT - Two Efforts Seek to Increase Food Security in Africa
  6. Flutter 动画组件
  7. ajax前台传json到后台解析的方法以及注意事项
  8. Python 中拼音库 PyPinyin 的用法,没错见名知意它就是用来翻译汉字的
  9. [jQuery] 通过ajax保存到服务器,成功显示信息.
  10. SpringBoot + MyBatis 之 Hello World
  11. MFC在一个工程中启动其他工程的exe文件
  12. idea快速生成SpringBoot项目无法启动问题
  13. xampp套件使用php,php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手),xampp安装使用...
  14. 电脑键盘为什么无法输入
  15. dismiss和remove_你真的了解iOS中控制器的present和dismiss吗?
  16. 云数据库 RDS for PostgreSQL的优势和应用
  17. matlab直流输电,基于MATLAB/Simulink的高压直流输电系统的仿真研究
  18. 台式计算机怎么进入bios,小编告诉大家hp台式机怎么进bios
  19. 常微分方程数值解——差商、欧拉公式详细推导及代码实现
  20. 【Java】 买卖股票的最佳时机含手续费

热门文章

  1. 从源码分析DEARGUI之添加字体
  2. 用Python爬取WordPress官网所有插件
  3. dslJson、jsoniter、fastjson、jackson解析字符串为map效率比较
  4. 在Docker应用场景下 如何使用新技术快速实现DevOps
  5. HDU-5532(LIS-nlogn)
  6. eclipse从数据库逆向生成Hibernate实体类
  7. VS2010 ASP.NET MVC4 安装失败问题
  8. 戴尔PowerEdge-C服务器新成员
  9. sql优化之:深入浅出理解索引(系列二)(讲解非常透彻)
  10. SSM实现学生宿舍管理系统