自定义View-幸运轮盘

因为在有些时候Android Studio中提供的控件不能满足我们的功能需求,但是我们又要做一个幸运大轮盘的功能,所以这时候我们需要用到我们Android中的一个知识点--------自定义View

在写代码之前我们先来理一下这个思路

1.定义数据
2. 画圆
3. 画弧并设置颜色区分
4. 在每个弧度上将数据放到上面
5. 设置指针选到的位置
6. 动画—用到旋转动画将我们的自定义View旋转起来
7. 定义随机数代表每次转到的次数

这是我的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="255dp"
    android:layout_height="255dp"
    tools:context=".MainActivity">

    <text.bwie.com.zdyview2.View_DLP
        android:id="@+id/dlp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/b"/>

</RelativeLayout >

这里是自定义View的代码

public class View_DLP extends View implements View.OnClickListener{
private String[] contents = new String[]{“美 女”, “女 神”, “热 舞”, “丰 满”, “性 感”, “知 性”};
public int[] colors = new int[]{Color.parseColor("#8EE5EE"), Color.parseColor("#FFD700"), Color.parseColor("#FFD39B"), Color.parseColor("#FF8247"), Color.parseColor("#FF34B3"), Color.parseColor("#F0E68C")};
public String centerText = “start”;
private int mWidth;
private Paint mPaint;
private Context mContext;
private RotateAnimation rotateAnimation;
private float newdul;

public View_DLP(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);

    this.mContext = context;
    mPaint = new Paint();
    setOnClickListener(this);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    //设置画笔颜色
    mPaint.setColor(Color.YELLOW);
    //画圆
    canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mPaint);
    //写一个跟圆一样占满全屏
    RectF rectF = new RectF(0, 0, mWidth, mWidth);
    //再次定义一下画笔
    mPaint.setStyle(Paint.Style.FILL);
    //设置弧和弧的颜色
    for (int i = 0; i < colors.length; i++) {
        //设置弧的颜色为我们数组中定义的颜色
        mPaint.setColor(colors[i]);
        //弧度设置为60
        int startjd = i * 60;
        canvas.drawArc(rectF, startjd, 60, true, mPaint);
    }

    //再次定义一下画笔
    mPaint.setColor(Color.RED);
    mPaint.setTextSize(25);
    //设置数据
    for (int i = 0; i < contents.length; i++) {
        int startjd = i * 60;
        Path path = new Path();
        //文字位置 rectF ,startjd 所占的角度  , 60  文字所占大小
        path.addArc(rectF,startjd,60);
        //文字水平和垂直方向的偏移量
        canvas.drawTextOnPath(contents[i],path,50,50,mPaint);
    }

    mPaint.setColor(Color.GREEN);
    canvas.drawCircle(mWidth / 2,mWidth / 2, 50,mPaint);
    mPaint.setColor(Color.BLACK);
    mPaint.setTextSize(24);
    Rect rect = new Rect();
    mPaint.getTextBounds(centerText, 0, centerText.length(), rect);
    int textWidth = rect.width();
    int textHeight = rect.height();
    canvas.drawText(centerText, mWidth / 2 - textWidth / 2, mWidth / 2 + textHeight / 2, mPaint);
}

//测量宽高的方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    //super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setMeasuredDimension(300, 300);
    //得到测量过后的宽和高      注意这是得到测量过后的宽和高使用getMeasuredWidth()方法
    mWidth = getMeasuredWidth();
}

@Override
public void onClick(View view) {
    //Random  定义一个随机数
    Random random = new Random();
    //nextInt  定义随机数取0-1000之间
    float dul = random.nextInt(1000);
    //其实在这里如果不加这个值的话  可能会出现随机顺时针逆时针的情况   然后下边是解决方案
    //rotateAnimation = new RotateAnimation(newdul, dul, mWidth / 2,mWidth / 2);
    rotateAnimation = new RotateAnimation(newdul, dul+1000, mWidth / 2, mWidth / 2);
    rotateAnimation.setFillAfter(true);
    rotateAnimation.setDuration(3000);
    startAnimation(rotateAnimation);
    //将随机数赋值给这个成员变量   便于下次点击在结束的地方开始抽奖
    newdul = dul % 360 +1000;
 } 

}

如果还没有看懂的话可以参考代码
地址:https://github.com/qq1341738311/zdyView_TheLuckyRoller

发布了37 篇原创文章 · 获赞 15 · 访问量 5561
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览