如何在Android中通过自定义view编写一个抽奖转盘

发布时间:2021-02-22 17:36:36 作者:戴恩恩
来源:亿速云 阅读:183

这篇文章主要介绍了如何在Android中通过自定义view编写一个抽奖转盘,此处给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:

TurntableActivity

package com.bawei.myapplication.turntable;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.RotateAnimation;

import com.bawei.myapplication.R;
import com.bawei.myapplication.turntable.CustomTurntableView;

/**
 * 转盘
 * @author hasee
 */
public class TurntableActivity extends AppCompatActivity {

 CustomTurntableView customTurntableView;
 boolean isTouchInSide = false;
 float mDownX, mDownY;


 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_turntable);

  initView();
 }

 private void initView() {
  customTurntableView = findViewById(R.id.custom);
//  findViewById(R.id.custom_inside).setOnClickListener(new View.OnClickListener() {
//   @Override
//   public void onClick(View v) {
//    float degrees = (float)(720 + Math.random() * 1000);
//    RotateAnimation rotateAnimation = new RotateAnimation(0, -degrees, 450, 450);
//    rotateAnimation.setDuration(5000);
//    rotateAnimation.setFillAfter(true);
//    customCircleView.startAnimation(rotateAnimation);
//   }
//  });

  findViewById(R.id.custom_inside).setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN &&
      event.getX() > 200 &&
      event.getX() < 300 &&
      event.getY() > 200 &&
      event.getY() < 300) {
     isTouchInSide = true;
     mDownX = event.getX();
     mDownY = event.getY();
     return true;
    }else if(event.getAction() == MotionEvent.ACTION_MOVE && (
      event.getX() < mDownX -10 ||
      event.getX() > mDownX + 10 ||
      event.getY() < mDownY -10 ||
      event.getY() > mDownY + 10) ){
     isTouchInSide = false;
    } else if (event.getAction() == MotionEvent.ACTION_UP &&
      event.getX() > mDownX -10 &&
      event.getX() < mDownX + 10 &&
      event.getY() > mDownY -10 &&
      event.getY() < mDownY + 10 &&
      isTouchInSide) {
     float degrees = (float) (720 + Math.random() * 1000);
     RotateAnimation rotateAnimation = new RotateAnimation(0, -degrees, 250, 250);
     rotateAnimation.setDuration(5000);
     rotateAnimation.setFillAfter(true);
     customTurntableView.startAnimation(rotateAnimation);
    }
    isTouchInSide = false;
    return false;
   }
  });
 }
}

对应的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/ll"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity">

 <com.bawei.myapplication.turntable.CustomTurntableView
  android:id="@+id/custom"
  android:layout_width="wrap_content"
  android:layout_height="500dp"
  />

 <com.bawei.myapplication.turntable.CustomTurntableInsideView
  android:id="@+id/custom_inside"
  android:layout_width="wrap_content"
  android:layout_height="500dp"
  app:text="开始"
  android:background="#3300ff00" />
</RelativeLayout>

自定义CustomTurntableView继承view

package com.bawei.myapplication.turntable;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

/**
 * 这里是画转盘的
 * @author hasee
 */
public class CustomTurntableView extends View{
 Paint mPaint;
 int mCircleCount = 6;
 float mStartAngle = 0;

 RectF rectF;

 public CustomTurntableView(Context context) {
  super(context);
  init();
 }

 public CustomTurntableView(Context context, @Nullable AttributeSet attrs) {
  super(context, attrs);
  init();
 }

 private void init(){
  mPaint = new Paint();
  mPaint.setColor(Color.BLUE);
  mPaint.setStrokeWidth(10);
  mPaint.setTextSize(60);
  mPaint.setStyle(Paint.Style.FILL);

  rectF = new RectF();
  rectF.top = 100;
  rectF.left = 100;
  rectF.right = 400;
  rectF.bottom = 400;
 }
 String[] textColor = {"一 等 奖","二 等 奖","三 等 奖","四 等 奖","五 等 奖","六 等 奖"};
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  for(int i = 0; i < mCircleCount; i++){
   //按角标单双号设置扇形颜色,
   if(i % 2 == 0 ){
    mPaint.setColor(Color.BLUE);
   }else{
    mPaint.setColor(Color.GREEN);
   }
   canvas.drawArc(rectF, mStartAngle, 60, true, mPaint);
   //设置转盘上的文字
   mPaint.setColor(Color.BLACK);
   mPaint.setTextSize(20);
   Path path = new Path();
   path.addArc(rectF,mStartAngle+20,60);
   canvas.drawTextOnPath(textColor[i],path,-10,40,mPaint);
   mStartAngle += 60;
  }
 }
}

自定义CustomTurntableInsideView继承view

package com.bawei.myapplication.turntable;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

import com.bawei.myapplication.R;

/**
 * 转盘中间开始按钮和指针
 * @author hasee
 */
public class CustomTurntableInsideView extends View {
 /**
  * 画笔
  */
 Paint mPaint;
 RectF mRectF;
 String mStr;

 public CustomTurntableInsideView(Context context) {
  super(context);
  init();
 }

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

  //自定义属性,如何添加自定义属性如下(考点)
  //第一步:在values文件夹下创建attrs.xml
  //第二步:详见attrs.xml文件内部
  //第三步:在所在的布局文件的根layout中添加xmlns:app="http://schemas.android.com/apk/res-auto"
  //第四步:在布局文件的控件中添加app:"你在attrs中设置的attr name"="你的值"
  //第五步:调用下面这句话,最后的为R.styleable.你在attrs中设置的declare-styleable name
  TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomTurntableView);
  //第六步:调用下面这句话,根据你在attrs中设置的format,选择getXXX方法,
  //入参为 R.styleable. 加上 你在attrs中设置的declare-styleable name 加上 _ 加上 你在attrs中设置的attr name
  mStr = typedArray.getString(R.styleable.CustomTurntableView_text);
  init();
 }

 private void init() {
  //以下注释请看CustomBingView里面
  mPaint = new Paint();
  mPaint.setColor(Color.RED);
  mPaint.setStrokeWidth(10);
  mPaint.setTextSize(20);
  mPaint.setStyle(Paint.Style.FILL);

  mRectF = new RectF();
  mRectF.top = 50;
  mRectF.bottom = 300;
  mRectF.right = 300;
  mRectF.left = 200;
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);

//  setMeasuredDimension(300, 300);
 }

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

  //设置画笔颜色为黑色,
  mPaint.setColor(Color.BLACK);
  //画出指针,用一个扇形,然后盖住后面补分来简单表示
  canvas.drawArc(mRectF, 60, 60, true, mPaint);

  mPaint.setColor(Color.RED);
  //画一个红色的圆形,就是中间的大按钮
  canvas.drawCircle(250, 250, 50, mPaint);

  mPaint.setColor(Color.BLACK);
  //添加按钮上的文字
  canvas.drawText(mStr, 230, 260, mPaint);

  //画三角,第一步,创建路径
//  Path path = new Path();
  //第二步,moveTo第一个顶点
//  path.moveTo(300, 300);
  //后续相继lineTo其他顶点
//  path.lineTo(300, 400);
//  path.lineTo(400, 400);
  //闭合
//  path.close();
//  画
//  canvas.drawPath(path, mPaint);
 }
}

自定义属性attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <!-- name为想要调用这个属性的类名即可 -->

 <declare-styleable name="CustomTurntableView">
  <!-- name为属性的名字,可以随意起,只要符合规则看得懂 -->
  <!-- format为属性内容的类型 -->
  <attr name="text" format="string"></attr>
 </declare-styleable>
</resources>

到此这篇关于如何在Android中通过自定义view编写一个抽奖转盘的文章就介绍到这了,更多相关的内容请搜索亿速云以前的文章或继续浏览下面的相关文章希望大家以后多多支持亿速云!

推荐阅读:
  1. 怎么在Python中利用Tkinter实现一个转盘抽奖器
  2. 如何实现Jquery转盘抽奖程序

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android view

上一篇:在Java中将List转换为Map的方式有哪些

下一篇:如何在Android中实现一个点击切换视图并跳转传值功能

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》