圆盘(抽奖)自定义View

Java代码
package com.jia.lianxi4yuanandtoolbar;

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.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;

public class ChoujiangView extends View implements View.OnClickListener {

private int screenWidth;
private int screenHeight;
private int centerX;
private int centerY;
private Paint mpaint;
private int[] colors;
private String[] desc;
private boolean isRote;//设置是否旋转
private RotateAnimation rotateAnimation;

public ChoujiangView(Context context) {
    this(context, null);
}

public ChoujiangView(Context context, AttributeSet attrs) {
    this(context, attrs, -1);
}

public ChoujiangView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    //获取屏幕的宽高
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
    screenWidth = displayMetrics.widthPixels;
    screenHeight = displayMetrics.heightPixels;
    //获取屏幕中心的坐标
    centerX = screenWidth / 2;
    centerY = screenHeight / 2;
    //初始化画笔
    initPaint();
    //设置6个圆弧的颜色
    colors = new int[]{Color.MAGENTA, Color.CYAN, Color.YELLOW, Color.GRAY, Color.GREEN, Color.BLUE};
    //设置6个圆弧的描述内容
    desc = new String[]{"香山", "长城", "百山", "公园", "睡觉", "逛吃"};
    //设置点击事件
    this.setOnClickListener(this);

}

//测量view大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //设置大小
    setMeasuredDimension(1000, 1000);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //移动坐标原点到屏幕中心
    canvas.translate(centerX, centerY);
    //绘制6个圆弧
    RectF rectF = new RectF(-300, -300, 300, 300);
    float start = 60;
    for (int i = 0; i < 6; i++) {
        mpaint.setColor(colors[i]);
        canvas.drawArc(rectF, start * i, 60, true, mpaint);
    }
    //画小圆
    mpaint.setColor(Color.RED);
    canvas.drawCircle(0, 0, 100, mpaint);
    //设置文字属性
    mpaint.setColor(Color.WHITE);
    mpaint.setTextSize(40);
    //设置小圆文字及宽高
    Rect rect = new Rect();
    mpaint.getTextBounds("start", 0, 5, rect);
    int width = rect.width();
    int height = rect.height();
    canvas.drawText("start", -width / 2, height / 2, mpaint);
    //绘制圆弧的描述信息
    RectF r = new RectF(-200, -200, 200, 200);
    for (int i = 0; i < 6; i++) {
        Path path = new Path();
        path.addArc(r, start * i + 20, 60);
        canvas.drawTextOnPath(desc[i], path, 0, 0, mpaint);
    }

}

private void initPaint() {
    mpaint = new Paint();
    mpaint.setColor(Color.RED);
    mpaint.setStrokeWidth(20);
    mpaint.setStyle(Paint.Style.FILL);
    mpaint.setAntiAlias(true);
}

@Override
public void onClick(View v) {
    if (!isRote) {
        startAnima();
    }
}

private void startAnima() {
    isRote = true;
    double random = Math.random();
    rotateAnimation = new RotateAnimation(0, (float) (360 * random), centerX, centerY);
    rotateAnimation.setFillAfter(true);
    rotateAnimation.setDuration(500);
    rotateAnimation.setRepeatMode(Animation.RESTART);
    rotateAnimation.setInterpolator(new LinearInterpolator());
    rotateAnimation.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            isRote = false;
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });
    startAnimation(rotateAnimation);
}

}

布局文件
<com.jia.lianxi4yuanandtoolbar.ChoujiangView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”>
</com.jia.lianxi4yuanandtoolbar.ChoujiangView>

猜你喜欢

转载自blog.csdn.net/aijaijgnaw/article/details/83660753