波浪刻度电池View
import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.LinearGradient;import android.graphics.Paint;import android.graphics.Path;import android.graphics.RectF;import android.graphics.Region;import android.graphics.Shader;import android.os.Build;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.View;import com.ums.flowmanager.utils.LoggerUtil;public class WaveBatteryView extends View { private final Paint bollPaint = new Paint(); // 水的颜色 public int waveColor = Color.parseColor("#010000FF"); Context context; private float paramFloat = 0.5F; private Path iPath; private float radius = 1.0F; // 圆圈背景颜色 可以设置为透明 private float circleBg = 0.0F; // 水浪画笔 private Paint wavePaint; private Path path; // 左右偏移 φ private int offset_lan = 0; // 上下偏移 private float offset_por = -10; // 角速度 private float angular_velocity = 0.5f; // 振幅 private int amplitude = 20; private int height; private int width; private float targetHeight; private float textHeight; private int progress = 0; // 0% 时,空白的高度 private float baseBlank; private float left = 50f; private float right = 150f; private float bottom = 180f; private float top = 15f; private WaveBatteryView.OnFinishedListener listener; private int ms = 4; private boolean isRun = true; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 1) { invalidate(); } } }; private MyThread myThread; public WaveBatteryView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; init(); d(); } private void init() { wavePaint = new Paint(); wavePaint.setAntiAlias(true); wavePaint.setShader(new LinearGradient(130f, 0f, 130f, 260f, Color.parseColor("#34A350"), Color.parseColor("#00c19a"), Shader.TileMode.MIRROR)); wavePaint.setColor(waveColor); path = new Path(); if (null == myThread) { myThread = new MyThread(); }//todo myThread.start(); isRun = true;// new MyThread().start(); } private void d() { bollPaint.setStrokeWidth(1.0F); // this.b.setColor(this.e); this.iPath = new Path(); } public WaveBatteryView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; init(); d(); } public WaveBatteryView(Context context) { super(context); this.context = context; init(); d(); } public void startThread() { this.isRun = true;// if (null == myThread) {// myThread = new MyThread();// }// myThread.start(); } public void stopThread() { this.isRun = false; if (null != myThread) { myThread.interrupt(); } myThread = null; } private void drawBatteryTop(Canvas canvas) { Paint mPaint = new Paint(); mPaint.setColor(Color.parseColor("#545454")); mPaint.isAntiAlias(); mPaint.setStyle(Paint.Style.FILL); RectF rectF = new RectF(); rectF.left = 80f; rectF.top = 0f; rectF.right = 120f; rectF.bottom = 30f; radius = 5; canvas.drawRoundRect(rectF, radius, radius, mPaint); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); int x = getWidth(); int y = getHeight(); radius = (y / 2 - 10); float paramY = (y * (1.0F - paramFloat) - 4.0f); circleBg = (paramY + 4.0f); this.iPath.reset(); bollPaint.setColor(Color.TRANSPARENT); drawBatteryTop(canvas); Paint mPaint = new Paint(); mPaint.setColor(Color.parseColor("#545454")); mPaint.isAntiAlias(); mPaint.setStyle(Paint.Style.FILL); RectF rectF = new RectF(); rectF.bottom = bottom; rectF.top = top; rectF.left = left; rectF.right = right; radius = 10; RectF rectF2 = new RectF(); rectF2.bottom = bottom; rectF2.top = top; rectF2.left = left; rectF2.right = right; radius = 10; RectF rectF3 = new RectF(); rectF3.left = 80f; rectF3.top = 0f; rectF3.right = 120f; rectF3.bottom = 30f; canvas.drawRoundRect(rectF, radius, radius, mPaint); // 将圆形排除到清除区域 this.iPath.addRoundRect(rectF2, radius, radius,Path.Direction.CCW); this.iPath.addRoundRect(rectF3,5,5,Path.Direction.CCW); // 裁剪 canvas.clipPath(this.iPath, Region.Op.REPLACE); setPath(); // 画波浪 canvas.drawPath(path, wavePaint); } private void drawBattery(Canvas canvas) { Paint mPaint = new Paint(); mPaint.setColor(Color.parseColor("#545454")); mPaint.isAntiAlias(); mPaint.setStyle(Paint.Style.FILL); RectF rectF = new RectF(); rectF.bottom = bottom; rectF.top = top; rectF.left = left; rectF.right = right; radius = 10; canvas.drawRoundRect(rectF, radius, radius, mPaint); } @Override @SuppressLint("NewApi") protected void onAttachedToWindow() { super.onAttachedToWindow(); if (Build.VERSION.SDK_INT >= 11) { setLayerType(1, null); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); initLayoutParams(); } private void initLayoutParams() { height = this.getHeight(); width = this.getWidth(); baseBlank = (float) (height * 0.9); targetHeight = baseBlank; offset_por = baseBlank; textHeight = baseBlank; } private void setPath() { int x = 0; int y = 0; path.reset(); for (int i = 0; i < width; i++) { x = i; y = (int) (amplitude * Math.sin((i * angular_velocity + offset_lan) * Math.PI / 180) + offset_por); if (i == 0) { path.moveTo(x, y); } path.quadTo(x, y, x + 1, y); } path.lineTo(width, height); path.lineTo(0, height); path.close(); } /** * @param p 0~1 */ public void updateProgress(float p) { if (p >= 0 && p <= 1) { targetHeight = (float) (baseBlank * (1 - p)); invalidate(); } } public WaveBatteryView setOffset_lan(int offset_lan) { this.offset_lan = offset_lan; return this; } public WaveBatteryView setWaveColor(int color) { this.waveColor = color; wavePaint.setColor(waveColor); return this; } /** * 波浪振幅, 默认为 20 */ public WaveBatteryView setAmplitude(int amplitude) { this.amplitude = amplitude; return this; } /** * @param //浪宽 默认为0.5 */ public WaveBatteryView setPalstance(float angular_velocity) { this.angular_velocity = angular_velocity; return this; } /** * @param ms * 默认为4毫秒 */ public WaveBatteryView setRefreshTime(int ms) { this.ms = ms; return this; } public void setOnFinishedListener(WaveBatteryView.OnFinishedListener l) { this.listener = l; } public interface OnFinishedListener { public void onFinished(); } class MyThread extends Thread { @Override public void run() { LoggerUtil.e("isRun:"+isRun); while (isRun) { offset_lan++; if (offset_por > targetHeight) { offset_por -= 0.5; progress = (int) ((baseBlank - offset_por) / baseBlank * 100); if (textHeight > (height / 2)) { textHeight -= 0.5; } } if (progress >= 100 && listener != null) { listener.onFinished(); isRun = false; } if (offset_lan == 360) { offset_lan = 0; } mHandler.sendEmptyMessage(1); try { Thread.sleep(ms); } catch (InterruptedException e) { e.printStackTrace(); } } } }}复制代码