package com.com.mr_wrong.CustomView;
import android.content.Context;
import android.content.res.TypedArray;
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.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import com.example.mr_wrong.androidstudioproject.R;
/**
* Created by Mr_Wrong on 15/5/31.
*/
public class CustomVolumContralBar extends View {
private int mFirsstColor;
private int mSecondColor;
private int mCircleWidth;
private int mDotCount;
private int mSplitSize;
private Bitmap mBg;
private Paint mPaint;
private Rect rect;
private int mCurrentCount = 3;
public CustomVolumContralBar(Context context) {
this(context, null);
}
public CustomVolumContralBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomVolumContralBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomVolumContralBar, defStyleAttr, 0);
mFirsstColor = array.getColor(R.styleable.CustomVolumContralBar_bar_fristcolor, Color.BLUE);
mSecondColor = array.getColor(R.styleable.CustomVolumContralBar_bar_secondcolor, Color.RED);
mCircleWidth = array.getDimensionPixelSize(R.styleable.CustomVolumContralBar_circlewidth, (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_PX, 20, getResources().getDisplayMetrics()));
mDotCount = array.getInt(R.styleable.CustomVolumContralBar_dotcount, 20);
mSplitSize = array.getInt(R.styleable.CustomVolumContralBar_splitsize, 20);
mBg = BitmapFactory.decodeResource(getResources(), array.getResourceId(R.styleable.CustomVolumContralBar_bg, 0));
array.recycle();
mPaint = new Paint();
rect = new Rect();
}
@Override
protected void onDraw(Canvas canvas) {
int centre = getWidth() / 2;
int radius = centre - mCircleWidth / 2;
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setAntiAlias(true);
drawOval(canvas, centre, radius);//绘制块块
double sqrt22 = Math.sqrt(2) / 2;
int relRadius = radius - mCircleWidth / 2;
rect.left = (int) (relRadius * (1 - sqrt22) + mCircleWidth);
rect.top = rect.left;
rect.right = (int) (rect.left + 2 * sqrt22 * relRadius);
rect.bottom = rect.right;
if (mBg.getWidth() < 2 * sqrt22 * relRadius) {//图片小 居中显示
rect.left = getWidth() / 2 - mBg.getWidth() / 2;
rect.top = getHeight() / 2 - mBg.getHeight() / 2;
rect.right = rect.left + mBg.getWidth();
rect.bottom = rect.top + mBg.getHeight();
}
canvas.drawBitmap(mBg, null, rect, mPaint);
}
/**
* 绘制块块
*/
private void drawOval(Canvas canvas, int centre, int radius) {
int itemsize = (360 - mDotCount * mSplitSize) / mDotCount;//每个块大小
RectF oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius);
mPaint.setColor(mFirsstColor);
for (int i = 0; i < mDotCount; i++) {
canvas.drawArc(oval, i * (itemsize + mSplitSize), itemsize, false, mPaint);
}
mPaint.setColor(mSecondColor);
for (int i = 0; i < mCurrentCount; i++) {
canvas.drawArc(oval, i * (itemsize + mSplitSize), itemsize, false, mPaint);
}
}
private void up() {
mCurrentCount++;
postInvalidate();
}
private void down() {
mCurrentCount--;
postInvalidate();
}
private int xDown, xUp;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
xDown = (int) event.getY();
break;
case MotionEvent.ACTION_UP:
xUp = (int) event.getY();
if (xUp > xDown) {//下
down();
} else {
up();
}
break;
}
return true;
}
}