package com.cjj;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DrawFilter;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
/**
* Created by cjj on 2016/2/22.
*/
public class SunLineView extends View {
private static final String Tag = SunLineView.class.getSimpleName();
private int mHeight, mWidth;
private Paint mLinePaint;//线的画笔
private int mLineLeft, mLineTop;// 线的左、上位置
private int mLineHeight; // 短线长度
private int mLineWidth;//线宽度
private int mFixLineHeight;
private int mLineBottom;
private int mSunRadius;
private Rect debugRect;
private RectF mouthRect;
private DrawFilter mDrawFilter;
private int mLineColor;
private int mLineLevel;
public SunLineView(Context context) {
this(context, null);
}
public SunLineView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SunLineView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
Log.i(Tag, "init");
mLineWidth = changeDp(1);
mLineHeight = changeDp(3);
mFixLineHeight = changeDp(6);
mSunRadius = changeDp(12);
mLineColor = Color.RED;
mLineLevel = 30;
//线的配置
mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mLinePaint.setColor(mLineColor);
mLinePaint.setStyle(Paint.Style.FILL_AND_STROKE);
// 设置画笔宽度
mLinePaint.setStrokeWidth(mLineWidth);
mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
| Paint.FILTER_BITMAP_FLAG);
debugRect = new Rect();
mouthRect = new RectF();
}
public void setLineColor(int lineColor){
mLineColor = lineColor;
invalidate();
}
public void setLineWidth(int lineWidth){
mLineWidth = changeDp(lineWidth);
invalidate();
}
public void setLineHeight(int lineHeight){
mLineHeight = changeDp(lineHeight);
mFixLineHeight = mLineHeight*2;
invalidate();
}
/**
* 设置太阳半径
*
* @param sunRadius
*/
public void setSunRadius(int sunRadius) {
mSunRadius = changeDp(sunRadius);
invalidate();
}
public void setLineLevel(int level){
mLineLevel = level;
invalidate();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
Log.i(Tag, "w---->" + w + " ------- h----->" + h);
mWidth = w;
mHeight = h;
mLineLeft = mWidth / 2 - mLineWidth / 2;
mLineTop = h / 2 - mSunRadius - mFixLineHeight;
mLineBottom = mLineTop + mLineHeight;
debugRect.left = mWidth / 2 - mSunRadius - mFixLineHeight;
debugRect.right = mWidth / 2 + mSunRadius + mFixLineHeight;
debugRect.top = mHeight / 2 - mSunRadius - mFixLineHeight;
debugRect.bottom = mHeight / 2 + mSunRadius + mFixLineHeight;
mouthRect.left = mWidth / 2 - mSunRadius / 2;
mouthRect.right = mWidth / 2 + mSunRadius / 2;
mouthRect.top = mHeight / 2 - mSunRadius / 2;
mouthRect.bottom = mHeight / 2 + mSunRadius / 2;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Log.i(Tag, "onMeasure");
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 = (mSunRadius + mFixLineHeight + mLineHeight) * 2 + getPaddingRight() + getPaddingLeft();
}
if (heightMode == MeasureSpec.EXACTLY) {
height = heightSize;
} else {
height = (mSunRadius + mFixLineHeight + mLineHeight) * 2 + getPaddingTop() + getPaddingBottom();
}
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.setDrawFilter(mDrawFilter);
super.onDraw(canvas);
drawLines(canvas);
}
/**
* 绘制line
* @param canvas
*/
private void drawLines(Canvas canvas) {
for (int i = 0; i <= 360; i++) {
if (i % mLineLevel == 0) {
canvas.save();
canvas.rotate(i, mWidth / 2, mHeight / 2);
canvas.drawLine(mLineLeft, mLineTop, mLineLeft, mLineBottom, mLinePaint);
canvas.restore();
}
}
}
public int changeDp(int value) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value,
getResources().getDisplayMetrics());
}
}