package com.duguang.baseanimation.ui.customview.morecustom.biaopan;
import com.duguang.baseanimation.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.Paint.Align;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
/*
* 内圆122
* 外圆204
* 圆环22
*/
public class BiaoPanview extends View {
private int measuredHeight;
private int measuredWidth;
private WindowManager wm;
private int width;
private int height;
private Pointer circlePointer;
private BiaoPanData data;
private float innerCircleRadius; // 外圆半径
private float outsideCircleRadius; // 内圆半径
private float yuanhuanRadius; // 圆环半径
public BiaoPanview(Context context, AttributeSet attrs) {
super(context, attrs);
}
@SuppressWarnings("deprecation")
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
wm = (WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE);
width = wm.getDefaultDisplay().getWidth();
height = wm.getDefaultDisplay().getHeight();
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(width * 33 / 320, 0, 0, 0); // 设置控件的margin
setLayoutParams(params);
setMeasuredDimension(width * 254 / 320, width * 254 / 320); // 设置控件的尺寸
measuredHeight = getMeasuredHeight(); // 测量控件高度
measuredWidth = getMeasuredWidth(); // 测量控件宽度
getCirclePointer(); // 获取圆心坐标
innerCircleRadius = 248 * measuredWidth / 512 / 2;
outsideCircleRadius = 410 * measuredWidth / 512 / 2;
yuanhuanRadius = 46 * measuredWidth / 512 / 2;
}
/**
* 获取圆心坐标
*/
private void getCirclePointer() {
float x = width / 2 - (width - measuredWidth) / 2;
float y = (getY() + measuredHeight) / 2;
circlePointer = new Pointer(x, y);
System.out.println(circlePointer);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setAntiAlias(true);
if (data != null) { // 数据不为空 绘制数据
paint.setTextSize(dip2px(getContext(), 32));
paint.setTextAlign(Align.CENTER);
canvas.drawText(data.getZhiliang() + "", circlePointer.getX(),
circlePointer.getY() - dip2px(getContext(), 6), paint);
paint.setTextSize(dip2px(getContext(), 14));
canvas.drawText(data.getChengdu(), circlePointer.getX(),
circlePointer.getY() + dip2px(getContext(), 12), paint);
canvas.drawText(data.getTianqi() + " " + data.getQiwen() + "°C",
circlePointer.getX(),
circlePointer.getY() + dip2px(getContext(), 28), paint);
paint.setColor(Color.WHITE);
canvas.drawText(data.getCity(), circlePointer.getX(),
circlePointer.getY() + outsideCircleRadius - yuanhuanRadius
/ 2, paint);
// 画质量的圆圈
double scale = (double) data.getZhiliang() / 500d;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.icon_morecustom_dx2x);
Pointer pointer = getZhiLiangCirclePointer(scale, bitmap);
float left = pointer.getX();
float top = pointer.getY();
paint = new Paint();
canvas.drawBitmap(bitmap, left, top, paint);
}
}
/**
* 根据数据获取质量的圆圈的圆心坐标
*
* @param scale
*/
private Pointer getZhiLiangCirclePointer(double scale, Bitmap bitmap) {
double angle = (45 + (315 - 45) * scale )* Math.PI / 180;
float radius = outsideCircleRadius - yuanhuanRadius - dip2px(getContext(), 1.5f); // 半径
float pointerX = circlePointer.getX() - bitmap.getWidth() / 2;
float pointerY = circlePointer.getY() - bitmap.getHeight() / 2 + radius;
float dX = radius * (float) Math.sin(angle);
float dY = (float) (radius * Math.cos(angle));
float x = pointerX - dX;
float y = pointerY - (radius - dY);
return new Pointer(x,y);
}
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 设置数据
*
* @param data
*/
public void setBiaopanData(BiaoPanData data) {
this.data = data;
invalidate();
}
}