1. 程式人生 > >自定義view實現圓盤抽獎的效果

自定義view實現圓盤抽獎的效果

package comjiang.lunview;

import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import android.view.animation.Animation; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation;

public class DiscView extends View implements View.OnClickListener { private RotateAnimation rotateAnimation; private Paint mPaint; private Paint strPaint; private int mWidth; private int mPadding; private boolean isStart = false; private RectF rectF; private String str=“start”; private String[] contents = new String[]{“代 碼”,“學 習”,“遊 戲”,“高 薪”,“勵 志”,“知 性”}; public DiscView(Context context) { this(context,null); }

public DiscView(Context context, AttributeSet attrs) {
    this(context, attrs,0);
}

public DiscView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initPaint();
    initAnim();
    setOnClickListener(this);
}
private void initAnim() {
    //以view的中心點為旋轉參考點
    rotateAnimation = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    rotateAnimation.setRepeatCount(-1);
    rotateAnimation.setFillAfter(true);
}

private void initPaint() {
    strPaint = new Paint();
    strPaint.setStyle(Paint.Style.STROKE);
    strPaint.setAntiAlias(true);
    strPaint.setColor(Color.WHITE);
    strPaint.setStrokeWidth(5);

    mPaint = new Paint();
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setAntiAlias(true);
    mPaint.setColor(Color.WHITE);
    mPaint.setStrokeWidth(3);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(300,300);
    mWidth = getMeasuredWidth();
    mPadding = 5;
    initRect();
}

private void initRect() {
    rectF = new RectF(0,0,mWidth,mWidth);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //繪製圓
    mPaint.setStyle(Paint.Style.STROKE);
    canvas.drawCircle(mWidth/2,mWidth/2,mWidth/2-mPadding,mPaint);
    //繪製 6個橢圓
    mPaint.setStyle(Paint.Style.FILL);

    initArc(canvas);

    //繪製裡面的小圓
    mPaint.setColor(Color.RED);
    mPaint.setStyle(Paint.Style.FILL);
    canvas.drawCircle(mWidth/2,mWidth/2,50,mPaint);


    mPaint.setColor(Color.WHITE);
    mPaint.setTextSize(24);
    Rect rect = new Rect();
    mPaint.getTextBounds(str, 0, str.length(), rect);
    int strWidth = rect.width();//文字的寬度
    int textHeight = rect.height();//文字的高度
    canvas.drawText(str,mWidth/2-25+25-strWidth/2,mWidth/2+textHeight/2,mPaint);


}

private void initArc(Canvas canvas) {
    for(int i=0;i<6;i++){
        mPaint.setColor(colors[i]);
        canvas.drawArc(rectF,(i-1)*60+60,60,true,mPaint);
    }
    for(int i=0;i<6;i++){
        mPaint.setColor(Color.BLACK);
        Path path = new Path();
        path.addArc(rectF,(i-1)*60+60,60);
        canvas.drawTextOnPath(contents[i],path,60,60,mPaint);
    }
}
public  int[] colors = new int[]{Color.parseColor("#8EE5EE"),Color.parseColor("#FFD700"),Color.parseColor("#FFD39B"),Color.parseColor("#FF8247"),Color.parseColor("#FF34B3"),Color.parseColor("#F0E68C")};
@Override
public void onClick(View view) {
    if(!isStart){
        isStart = true;
        rotateAnimation.setDuration(1000);
        rotateAnimation.setInterpolator(new LinearInterpolator());//不停頓
        startAnimation(rotateAnimation);
    }else{
        isStart = false;
        stopAnim();
    }
}
public void stopAnim() {
    clearAnimation();
}

}