android 自定义表盘控件
来源:互联网 发布:网络实施方案 编辑:程序博客网 时间:2024/05/02 05:51
效果图如下
attrs.xml
<?xml version="1.0" encoding="utf-8"?><resources> <!--弧的颜色--> <attr name="part1_color" format="color" /> <attr name="part2_color" format="color" /> <attr name="part3_color" format="color" /> <!--刻度颜色--> <attr name="scale_font_color" format="color" /> <!--刻度大小--> <attr name="scale_font_size" format="dimension" /> <!--半径--> <attr name="radius" format="dimension" /> <!--弧线宽度--> <attr name="arc_width" format="dimension" /> <!--补偿 越大 越外--> <attr name="offset" format="dimension" /> <declare-styleable name="FlowView"> <attr name="part1_color" /> <attr name="part2_color" /> <attr name="part3_color" /> <attr name="scale_font_color" /> <attr name="scale_font_size" /> <attr name="radius" /> <attr name="arc_width" /> <attr name="offset" /> </declare-styleable></resources>
FlowView.java
package com.hutao.liaoningmobile.view;import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import android.animation.TimeInterpolator;import android.animation.ValueAnimator;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.util.AttributeSet;import android.util.TypedValue;import android.view.View;import com.hutao.liaoningmobile.R;/** * Created by aoc on 2016/10/10. */public class FlowView extends View { private final Rect mBound; private int part1Color; private int part2Color; private int part3Color; private int scaleFontColor; private int scaleFontSize; private int radius; private int arcWidth; private int offset; private float startAngle = 135f; private float sweepAngle = 90f; private Paint paint; private RectF rectF; private Paint textPaint; private String[] scaleText = {"0", "15", "30", "45", "60", "75", "90", "105", "120", "135"}; private float percent; private float oldPercent = 0f; private float speed; private ValueAnimator valueAnimator; private long animatorDuration; private TimeInterpolator interpolator = new SpringInterpolator(); public FlowView(Context context) { this(context, null); } public FlowView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public FlowView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.FlowView, defStyleAttr, 0); int count = array.getIndexCount(); for (int i = 0; i < count; i++) { int attr = array.getIndex(i); switch (attr) { case R.styleable.FlowView_part1_color: part1Color = array.getColor(attr, Color.WHITE); break; case R.styleable.FlowView_part2_color: part2Color = array.getColor(attr, Color.WHITE); break; case R.styleable.FlowView_part3_color: part3Color = array.getColor(attr, Color.WHITE); break; case R.styleable.FlowView_scale_font_color: scaleFontColor = array.getColor(attr, Color.WHITE); break; case R.styleable.FlowView_scale_font_size: scaleFontSize = array.getDimensionPixelSize(attr, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, context.getResources().getDisplayMetrics())); break; case R.styleable.FlowView_radius: radius = array.getDimensionPixelSize(attr, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, context.getResources().getDisplayMetrics())); break; case R.styleable.FlowView_arc_width: arcWidth = array.getDimensionPixelSize(attr, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, context.getResources().getDisplayMetrics())); break; case R.styleable.FlowView_offset: offset = array.getDimensionPixelSize(attr, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, context.getResources().getDisplayMetrics())); break; } } array.recycle(); paint = new Paint(); paint.setAntiAlias(true); rectF = new RectF(); textPaint = new Paint(); textPaint.setAntiAlias(true); textPaint.setTextSize(scaleFontSize); textPaint.setColor(scaleFontColor); mBound = new Rect(); textPaint.getTextBounds(String.valueOf(speed), 0, String.valueOf(speed).length(), mBound); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height ; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { width = radius * 2 + arcWidth; } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { height = radius * 2 + arcWidth; } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { drawArc(canvas); drawScale(canvas); drawPointer(canvas); drawUnit(canvas); drawSpeed(canvas); } //画表盘 private void drawArc(Canvas canvas) {// paint.setColor(Color.BLUE);// canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint); paint.setColor(part1Color); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(arcWidth); int left = getWidth() / 2; int top = getHeight() / 2; rectF.set(left - radius, top - radius , left + radius , top + radius ); canvas.drawArc(rectF, startAngle, sweepAngle, false,paint); paint.setColor(part2Color); canvas.drawArc(rectF, startAngle + sweepAngle, sweepAngle, false,paint); paint.setColor(part3Color); canvas.drawArc(rectF, startAngle + sweepAngle * 2, sweepAngle, false,paint); //圆心 paint.setColor(Color.YELLOW); canvas.drawCircle(rectF.centerX(), rectF.centerY(), 10, paint); } //画刻度 private void drawScale(Canvas canvas) { canvas.save(); //记录画布状态 paint.setColor(scaleFontColor); paint.setStrokeWidth(3); canvas.rotate(-90f, rectF.centerX(), rectF.centerY()); float rAngle = sweepAngle * 3 / (scaleText.length - 1); for (int i = 0; i < scaleText.length ; i++) { canvas.save(); //记录画布状态 canvas.rotate(rAngle * i, rectF.centerX(), rectF.centerY()); float startX = rectF.centerX() - radius + arcWidth * 4 - offset; float startY = rectF.centerY() - radius + arcWidth * 4 - offset; canvas.drawLine(startX, startY , startX + 15, startY + 15, paint);//画短刻度线 canvas.drawText(scaleText[i] , startX + 25, startY + 35, textPaint); canvas.restore(); } canvas.restore(); } //画指针 private void drawPointer(Canvas canvas) { canvas.save(); canvas.rotate(percent, rectF.centerX(), rectF.centerY()); canvas.drawLine(rectF.centerX(), rectF.centerY(), rectF.centerX() - radius / 2 + 20 , rectF.centerY() + radius / 2 - 20, paint); canvas.restore(); } //单位 private void drawUnit(Canvas canvas) { textPaint.setColor(Color.GRAY); textPaint.setTextSize(scaleFontSize / 1.2f); canvas.drawText("Kbps", rectF.centerX() - mBound.width() / 2 - arcWidth / 3, rectF.centerY() + radius / 2 + arcWidth, textPaint); } //显示速度 private void drawSpeed(Canvas canvas) { textPaint.setColor(Color.YELLOW); textPaint.setTextSize(scaleFontSize); canvas.drawText(String.valueOf(speed), rectF.centerX() - mBound.width() / 2, rectF.centerY() + radius - arcWidth, textPaint); } public void setSpeed(float speed) { this.speed = speed; percent = sweepAngle * 3 / 135 * speed; setAnimator(percent); } //动画 private void setAnimator(final float percent) { if (valueAnimator != null && valueAnimator.isRunning()) { valueAnimator.cancel(); } animatorDuration = (long) Math.abs(percent - oldPercent) * 20; valueAnimator = ValueAnimator.ofFloat(oldPercent, percent).setDuration(animatorDuration); valueAnimator.setInterpolator(interpolator); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { FlowView.this.percent = (float) animation.getAnimatedValue(); invalidate(); } }); valueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); oldPercent = percent; } }); valueAnimator.start(); }}
SpringInterpolator
package com.hutao.liaoningmobile.view;import android.view.animation.Interpolator;/** * Created by aoc on 2016/10/11. */public class SpringInterpolator implements Interpolator { private final float mTension; public SpringInterpolator() { mTension = 0.4f; } public SpringInterpolator(float tension) { mTension = tension; } @Override public float getInterpolation(float input) { float result = (float) (Math.pow(2,-10 * input) * Math.sin((input - mTension / 4) * (2 * Math.PI)/mTension) + 1); return result; }}
main.xml
<net.sytm.liaoningmobile.view.FlowView android:layout_width="match_parent" android:layout_height="match_parent" app:part1_color="#00efae" app:part2_color="#00c6ff" app:part3_color="#df3979" app:scale_font_color="@android:color/white" app:radius="100dp" app:arc_width="10dp" app:scale_font_size="14sp" app:offset="7dp" android:id="@+id/flow_view_id"/>
mainactivity.java
FlowView flowView = (FlowView) view.findViewById(R.id.flow_view_id); flowView.setSpeed(100f);
0 0
- android 自定义表盘控件
- 自定义控件------------车表盘
- android自定义表盘
- android 自定义表盘
- QT 自定义控件之速度表盘
- Andoird自定义控件_弧度表盘
- 自定义表盘
- 自定义表盘
- Android带表盘钟表控件AnalogClock
- android一个简单的自定义表盘
- android自定义刻度盘 表盘 速度表
- android 自定义view实现表盘效果
- Android 自定义View 实现表盘效果
- Android 自定义view(画表盘)
- Android 自定义View 实现表盘效果
- android 自定义 view 实现表盘效果
- Android 自定义View——表盘实例
- 学习笔记自定义控件之——自定义表盘
- xml-java-servlet
- 新手编程导论
- android:drawableXXX图片和文字的距离控制
- 查看UserAgent的方法
- Hibernate
- android 自定义表盘控件
- webView与navigationController公用返回键
- 322. Coin Change
- sql 的update中使用case when
- xcode-select: error: tool 'xcodebuild' requires Xcode错误解决方法
- 【HDU3944 】DP?【LUCAS定理+阶乘预处理】 【杨辉三角中的点(第n行m列),问你从(0,0)点走到该点经过的点最少的权值和(只能向下走或斜着走)。同时对素数p取余】
- python初始化二维数组
- Spring
- web前端-CSS 图像拼合技术 -028