概述:

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

先结果演示:

Damo

public 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() {@Overridepublic 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);}@Overrideprotected 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);}@Overrideprotected 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-200mPath.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() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);//处理msgswitch (msg.what) {case DOWNLOAD_UPDATE:progress += 1;//当progress大于maxProgress时,不再调用一下方法if (progress<=myPathView.getMaxProgress()){myPathView.setProgress(progress);//设置新的进度sendEmptyMessageDelayed(DOWNLOAD_UPDATE, 100);//每隔100毫秒发送一次handler}break;}}};@Overrideprotected 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() {@Overridepublic void onClick(View v) {//向handler发送一个延时空消息,1000毫秒后发送mHandler.sendEmptyMessageDelayed(DOWNLOAD_UPDATE, 1000);}});}
}

布局调用自定义View:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Button
        android:id="@+id/button_start"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Start Download"/><com.example.administrator.selfdefinedview.widget.MyPathView
        android:id="@+id/progress_view_first"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

我们猿类工作压力大,很需要有自己的乐趣,于是乎,我开通了音乐人账号,以后的作品将会上传到我的音乐人小站上。如果这篇博客帮助到您,希望您能多关注,支持,鼓励我将创作进行下去,同时也祝你能在工作和生活乐趣两发面都能出彩!

如果这篇博客帮助到您,您可以完成以下操作:
在网易云搜索“星河河”->歌手->点击进入(您将进入我的网易云音乐人账号星河河)->关注我->多听听我的歌。
豆瓣音乐人地址:https://site.douban.com/chuxinghe/ 星河河

Android自定义View之图形图像(模仿360的刷新球自定义一个SeekBar)相关推荐

  1. android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定

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

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

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

  3. Android 自定义view完全解析--带你通透了解自定义view

    参考转自郭霖博客带你一步步深入了解View系列 Android LayoutInflater原理分析 相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用 ...

  4. android愤怒小鸟游戏、自定义View、掌上餐厅App、OpenGL自定义气泡、抖音电影滤镜效果等源码...

    2019独角兽企业重金招聘Python工程师标准>>> Android精选源码 精练的范围选择器,范围和单位可以自定义 自定义View做的小鸟游戏 android popwindow ...

  5. android愤怒小鸟游戏、自定义View、掌上餐厅App、OpenGL自定义气泡、抖音电影滤镜效果等源码... 1

    Android精选源码 精练的范围选择器,范围和单位可以自定义 自定义View做的小鸟游戏 android popwindow选择商品规格颜色尺寸效果源码 实现Android带有锯齿背景的优惠样式源码 ...

  6. android愤怒小鸟游戏、自定义View、掌上餐厅App、OpenGL自定义气泡、抖音电影滤镜效果等源码

    Android精选源码 精练的范围选择器,范围和单位可以自定义 自定义View做的小鸟游戏 android popwindow选择商品规格颜色尺寸效果源码 实现Android带有锯齿背景的优惠样式源码 ...

  7. Android自定义View(1)——初步实现简单的自定义View

    已经有一段时间没有给大家更新博客了,貌似自从学校的实训一开始就一直没有心思去学新的东西和写博客,因为这段时间一直都有很多事情要忙,而且笔者马上就要开始实习工作了,可能心理上也是有一定的压力哈哈.现在事 ...

  8. android lrc 歌词view,自定义View强势来袭,用自定义View实现歌词显示控件下篇之自定义LyricView的实现...

    在上篇中,我与大家分享了关于如何进行*.lrc歌词文件的解析,以及将解析完成后的歌词展示在镶嵌在ScrollView中的TextView上,就这样而言,一个简单的歌词显示功能也就实现了. 但是,如何才 ...

  9. Android自定义view之measure、layout、draw三大流程

    自定义view之measure.layout.draw三大流程 一个view要显示出来,需要经过测量.布局和绘制这三个过程,本章就这三个流程详细探讨一下.View的三大流程具体分析起来比较复杂,本文不 ...

最新文章

  1. 别再说你不会 ElasticSearch 调优了,都给你整理好了
  2. 网易云音乐的消息队列改造之路
  3. 小程序工程化实践(上篇)-- 手把手教你撸一个小程序 webpack 插件,一个例子带你熟悉 webpack 工作流程...
  4. Java——重载和重写
  5. 用python编写最简单的记事本_Python使用字典实现的简单记事本功能示例
  6. 4.9 利用对应的泛型替换Hashtable[转]
  7. vue如何判断已经有定时器在执行_中国股市:如何判断当日涨跌?“分时图”已经全部告诉你了...
  8. 检查计算机网络是否连通可运行什么命令,用ping命令如何检测目标主机是否能连通...
  9. zabbix的boot.log占满根目录不能ssh连接No space left on device
  10. 您的计算机性能不足 无法运行,绝地求生进不去游戏提示运行引擎需要DX11特性等级10.0,大神救我,刚做的系统W10 64位的,游戏也是刚下的...
  11. ubuntu2004使用Renesas upd720202 扩展卡
  12. Kinect2.0相机标定
  13. 图像坐标球面投影_晶体的球面坐标与球面投影
  14. 中望3d快捷键命令大全_3d快捷键怎么设置|中望3D快捷键设置
  15. 再见了, 达叔!我用Python回顾一代喜剧大师203部作品,太经典了!
  16. 飞信机器人 ld-linux.so.2,飞信机器人安装
  17. 计算机方向键是哪个键,left键是哪个键
  18. android 微博 4.1sdk,android使用新浪微博最新SDK4.1进行第三方授权登录
  19. 社区10款年度优秀插件框架盘点!
  20. java毕业设计鸿鹄教育培训(附源码、数据库)

热门文章

  1. 2023年最新批量删除微博_新版微博怎么批量删除自己发的微博?
  2. 【FPGA_001】用Verilog写一个数组,会耗费很多资源
  3. python(Django之组合搜索、JSONP、XSS过滤 )
  4. 创建手工凭证实现分录中原币=0本位币<>0的效果-FBB1
  5. Go 1.16中值得关注的几个变化
  6. fiddler抓手机端的包(苹果手机)
  7. ESP8266用点灯app接入小爱同学
  8. 购物车列表加载商品信息及商品增减功能(Ajax+jQuery)
  9. 蓝牙4.0 OSAL层工作原理
  10. m4a转如何快速转换为wav格式呢