自定义水球

效果图:

这里的水波纹效果实际上是用得到了数学里的正弦函数,关于正弦函数:

正弦型函数解析式:y=Asin(ωx+φ)+h
各常数值对函数图像的影响:
φ(初相位):决定波形与X轴位置关系或横向移动距离(左加右减)
ω:决定周期(最小正周期T=2π/|ω|)
A:决定峰值(即纵向拉伸压缩的倍数)
h:表示波形在Y轴的位置关系或纵向移动距离(上加下减)

整个view的绘制,可以分解成3步:

  1. 绘制出一个圆形的路径,并使用clipPath方法裁剪出来,并设置接下来绘制的两部分的显示方式;
  2. 在裁剪下来的canvas上在绘制一个背景圆;
  3. 在背景圆上绘制水波纹。

clipPath:

public boolean clipPath(Path path, Region.Op op) {
}
关于Region.Op参数:

把第一次clipRect的绘制范围设为A,第二次clipRect设定的范围设为B

Op.DIFFERENCE,实际上就是求得的A和B的差集范围,即A-B,只有在此范围内的绘制内容才会被显示;

Op.REVERSE_DIFFERENCE,实际上就是求得的B和A的差集范围,即B-A,只有在此范围内的绘制内容才会被显示;;

Op.INTERSECT,即A和B的交集范围,只有在此范围内的绘制内容才会被显示;

Op.REPLACE,不论A和B的集合状况,B的范围将全部进行显示,如果和A有交集,则将覆盖A的交集范围;

Op.UNION,即A和B的并集范围,即两者所包括的范围的绘制内容都会被显示;

Op.XOR,A和B的补集范围,此例中即A除去B以外的范围,只有在此范围内的绘制内容才会被显示;

关于clipPath更多

下面是自定义水球的代码:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.graphics.Rect;
import android.graphics.Region;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;/*** 水球*/
public class WaveBallView extends SurfaceView implements SurfaceHolder.Callback{private SurfaceHolder surfaceHolder;private boolean isDraw;private Paint wavepaint,circlepaint;private Path path;/** 水波纹颜色*/private int wavecolor=Color.GREEN;/** 圆球颜色*/private int circlecolor=Color.RED;private Canvas canvas;private MyThread myThread;private MyThread2 myThread2;private int centerX,centerY,radius;/** 水面目标高度*/private float targetValue=0.8f;/** 实际进度*/private float target;private Rect rect;private String text;private int textheight;private int x = 0,y = 0;/** 初相位(横向移动距离)*/private int φ;/** 周期*/private float w=0.5f;/** 峰值*/private int A=20;/** 纵向移动距离*/private int h;/*** 设置背景圆颜色* @param circlecolor*/public void SetCircleBackgroundColor(int circlecolor){this.circlecolor=circlecolor;}/*** 设置水球颜色* @param wavecolor*/public void SetWaveColor(int wavecolor){this.wavecolor=wavecolor;}/*** 设置目标值* @param targetValue*/public void SetTarget(float targetValue){if(targetValue!=0)this.targetValue=targetValue;}public WaveBallView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}public WaveBallView(Context context, AttributeSet attrs) {super(context, attrs);init();}public WaveBallView(Context context) {super(context);init();}private void init() {wavepaint=new Paint();circlepaint=new Paint();wavepaint.setStyle(Style.FILL);circlepaint.setStyle(Style.FILL);circlepaint.setTextAlign(Align.CENTER);circlepaint.setTextSize(80);path=new Path();myThread=new MyThread();myThread2=new MyThread2();surfaceHolder=getHolder();surfaceHolder.addCallback(this);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);centerX=w/2;centerY=h/2;radius=Math.min(centerX,centerY);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {isDraw=true;wavepaint.setColor(wavecolor);circlepaint.setColor(circlecolor);myThread.start();myThread2.start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {isDraw=false;myThread=null;myThread2=null;}/*    正弦型函数解析式:y=Asin(ωx+φ)+h各常数值对函数图像的影响:φ(初相位):决定波形与X轴位置关系或横向移动距离(左加右减)ω:决定周期(最小正周期T=2π/|ω|)A:决定峰值(即纵向拉伸压缩的倍数)h:表示波形在Y轴的位置关系或纵向移动距离(上加下减)*/class MyThread extends  Thread{@Overridepublic void run() {if(isDraw){draw();}}private void draw() {while(true){if(target<targetValue){target+=0.1f;h=(int) (centerY+radius-target*radius*2);}canvas=surfaceHolder.lockCanvas();if(canvas==null || !isDraw)break;canvas.drawColor(Color.WHITE);path.reset();//重置之前所有设置path.addCircle(centerX,centerY, radius,Direction.CCW);canvas.drawCircle(centerX,centerY, radius, circlepaint);canvas.clipPath(path,Region.Op.INTERSECT);//裁剪//最后一个参数有多个选择分别是://DIFFERENCE是第一次不同于第二次的部分显示出来//REPLACE是显示第二次的//REVERSE_DIFFERENCE 是第二次不同于第一次的部分显示//INTERSECT交集显示//UNION全部显示//XOR补集 就是全集的减去交集剩余部分显示path.reset();//重置之前所有设置for (int i = 0; i < centerX*2; i++) {x=i;y=(int) (A*Math.sin((w*i+φ)*Math.PI/180)+h);if(x==0)path.moveTo(x,y);path.quadTo(x, y, x + 1, y);}path.lineTo(centerX*2,centerY+radius);path.lineTo(0,centerY+radius);path.close();//回到初始点 形成封闭路径canvas.drawPath(path,wavepaint);drawText(canvas);surfaceHolder.unlockCanvasAndPost(canvas);try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}}}/*** 绘制文字* @param canvas*/public void drawText(Canvas canvas) {rect=new Rect();text=String.format("%.1f",target*100)+"%";circlepaint.getTextBounds(text, 0, text.length()-1, rect);textheight=rect.bottom-rect.top;canvas.drawText(text, centerX, centerY+textheight/2, circlepaint);}class MyThread2 extends Thread{@Overridepublic void run() {if(isDraw){addφ();}}}public void addφ() {while(true){φ+=1;if(φ==360)φ=0;if(!isDraw)break;try {Thread.sleep(4);} catch (InterruptedException e) {e.printStackTrace();}}}}

有需要可以点击这里:下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352425.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

d3js 实现水球图

d3js 源码地址&#xff1a;: http://bl.ocks.org/brattonc/5e5ce9beee483220e2f6 官方提供的代码不能直接用&#xff0c;版本3.x 这是调整后v5能使用的。 <!DOCTYPE html> <html><head><meta charsetutf-8><meta http-equivX-UA-Compatible conte…

echarts 画动态水球

前言 在对一些需要存放液体的工厂进行开发基于物联网传感器的监控平台时&#xff0c;经常需要监控 该蓄水池当前所处的容量占比为多少。 以达到随时调整其蓄水量的目的。接下来我们看 一下一些常见的水球项目。 有这样的&#xff1a; 这样的&#xff1a; 甚至还有这样的&…

ECHARTS 水球图

转载编辑。 原作者链接地址&#xff1a;https://zhuanlan.zhihu.com/p/25353670?group_id827655855632715776 水球图是一种适合于展现单个百分比数据的图表类型&#xff0c;ECharts 的水球图插件使你能够通过非常简单的配置&#xff0c;实现酷炫的数据展示效果。 第一步&…

echarts 水球图

// ECharts 水球图插件&#xff0c;需要额外插件脚本&#xff0c;参见上方“脚本” // 完整配置参数参见&#xff1a;https://github.com/ecomfe/echarts-liquidfillvar option {series: [{type: liquidFill,data: [0.6, 0.5, 0.4, 0.3],radius: 40%,shape: diamond,center: […

从0到1:如何建立一个大规模多语言代码生成预训练模型

国产AI辅助编程工具CodeGeeX是一个使用AI大模型为基座的辅助编程工具&#xff0c;帮助开发人员更快的编写代码。可以自动完成整个函数的编写&#xff0c;只需要根据注释或Tab按键即可。它已经在Java、JavaScript和Python等二十多种语言上进行了训练&#xff0c;并基于大量公开的…

【Python】打包与发布(Packaging and distributing projects)

以Unix/macOS系统为例。 前提准备&#xff1a;确保pip为最新版本&#xff0c;可使用以下命令来更新pip&#xff1a; python3 -m pip install --upgrade pip一、创建一个简单的项目 我们在目录packaging_tutorial下进行操作。 项目名称为&#xff1a;example_package_wayne。 …

2023国际管理会计教育联盟发展论坛在沪成功召开

2023年5月7日&#xff0c;由教育部中外人文交流中心、国际管理会计教育联盟&#xff08;下称“联盟”&#xff09;主办&#xff0c;中国商业会计学会、上海交通大学安泰经济与管理学院承办的2023国际管理会计教育联盟发展论坛&#xff08;下称“发展论坛”&#xff09;在上海成…

系统架构师之高内聚低耦合

一、概念&#xff1a; 标记耦合&#xff08;Stamp Coupling&#xff09;和数据耦合&#xff08;Data Coupling&#xff09;是软件设计中两种不同的耦合类型&#xff0c;它们之间的区别如下&#xff1a; 标记耦合&#xff1a;标记耦合是指模块之间通过参数传递标记或标识符来进…

怎样把m4a转换成mp3格式?

怎样把m4a转换成mp3格式&#xff1f;大家都知道m4a音频格式兼容性差&#xff0c;这已成为许多小伙伴头疼的问题&#xff0c;因为很多人不会m4a转mp3的方法&#xff0c;从而导致m4a音频无法正常播放。在过去&#xff0c;想把m4a转换成mp3格式确实有一定的难度&#xff0c;但是如…

m4a怎么转换成mp3格式?

最近总有伙伴问我&#xff1a;“小编&#xff0c;m4a怎么转换成mp3格式&#xff1f;有没有什么简单有效的方法”。其实要想把m4a转换成mp3格式&#xff0c;转换工具就是钥匙&#xff0c;有了这把钥匙你就能更快地打开m4a转mp3格式的大门了。所以&#xff0c;选择好转换工具&…

如何快速的把m4a转换成mp3格式

无论是把m4a转换成mp3格式&#xff0c;还是把其他别的格式转换成mp3格式&#xff0c;一直都是有搜索热度的问题。虽然近两年把m4a转换成MP3的解决方法有很多&#xff0c;但是依旧满足不了小伙伴们寻找转换方法的现状。最主要的原因不是大家找不到转换成MP3的方法&#xff0c;而…

怎样把m4a转换mp3格式?

怎样把m4a转换mp3格式&#xff1f;m4a是苹果手机上的录音文件格式&#xff0c;随着苹果手机的广泛普及&#xff0c;m4a音频文件使用也越来越多&#xff0c;有的小伙伴将m4a音频文件转载到电脑上后&#xff0c;会因为兼容性的问题导致m4a文件不能打开播放。由于m4a是苹果公司开发…

m4r是什么文件格式?m4r怎么转成mp3?

你知道m4r是什么文件格式吗&#xff1f;如果你不知道是正常的&#xff0c;因为它真的太少见了&#xff0c;其实m4r是iPhone铃声的一种音频格式&#xff0c;简单的说m4就是音质音频文件的格式&#xff0c;并且实在iPhone手机上使用。如果你是安卓手机&#xff0c;是不能打开这种…

如何将录音m4a转换为mp3格式?

如何将录音m4a转换为mp3格式&#xff1f;前段时间由于工作原因&#xff0c;需要上传录音文件到一个网站上&#xff0c;可是这个录音文件怎么也上传不上去&#xff0c;查看原因后才发现原来网站只支持mp4的音频文件&#xff0c;而我是用苹果手机录音的&#xff0c;录音文件是m4a…

m4a怎么转换mp3格式?详细的步骤

有经常下载歌曲的小伙伴们&#xff0c;一定遇到过m4a格式的音频文件&#xff0c;这种格式的音频文件因为自身适配性的原因&#xff0c;导致很多播放器是无法对其进行正常播放&#xff0c;所以用户要想使用此格式的视频&#xff0c;就不得不把它转成主流格式mp3&#xff0c;这样…

m4a音频转换mp3格式的方法

很多朋友都在问m4a音频转换mp3格式的方法这个问题&#xff0c;小编根据大家的实际要求和诉求在网上寻找了很多的m4a转换成mp3的方法&#xff0c;这些方法都可以将m4a转换成mp3&#xff0c;但是在速度和稳定性方面有所差异。尤其是在使用的软件方面&#xff0c;每个软件中所具备…

m4a格式怎么转换成mp3,非常简单

m4a格式怎么转换成mp3&#xff1f;m4a是一种文件的扩展名&#xff0c;确切的说是一种音频文件格式。 为了区分mpeg-4中的音频和视频文件&#xff0c;苹果率先使用m4a格式替换了mpeg-4中的音频文件扩展名。 因为m4a主要应用于苹果手机&#xff0c;苹果手机的用户量很大&#xff…

如何把m4a转换成mp3?音频格式转换步骤

最近有好多朋友反映自己手机录音机里文件是m4a格式的&#xff0c;那这样m4a格式的音频在音响&#xff0c;播放器或者很多别的软件中都是无法进行播放的&#xff0c;而且m4a格式的音频在传输中还会受到一定的限制&#xff0c;这个时候我们就需要把m4a转换成常用的Mp3音频格式来完…

m4r转mp3格式用什么音频转换器好

经常玩弄铃声制作的童鞋也许比较清楚m4r是什么格式&#xff0c;m4r是iphone铃声的一种音频格式&#xff0c;在国内的一些iPhone铃声资源站或者是苹果iTunes上都是有得下载&#xff0c;不过对于安卓或者非ios系统的手机来说&#xff0c;它们并不支持m4r格式音频&#xff0c;这个…

如何将mp4视频转换成m4r音频

把mp4转换成m4r格式&#xff0c;很明显&#xff0c;mp4是视频格式&#xff0c;m4r是音频格式&#xff0c;视频转音频&#xff01;还可以说成是提取视频中的音频或声音&#xff0c;其实这种需求在用户当中还是有一些的&#xff0c;比如需要提取某部电脑里面某段声音&#xff0c;…