Android自定义view制作抽奖转盘

本文实例为大家分享了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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们,关注我们公众号的更多精彩内容。

(0)

相关推荐

  • Android自定义View实现QQ运动积分转盘抽奖功能

    因为偶尔关注QQ运动, 看到QQ运动的积分抽奖界面比较有意思,所以就尝试用自定义View实现了下,原本想通过开发者选项查看下界面的一些信息,后来发现积分抽奖界面是在WebView中展示的,应该是在H5页面中用js代码实现的,暂时不去管它了. 这里的自定义View针对的是继承自View的情况,你可以将Canvas想象为画板, Paint为画笔,自定义View的过程和在画板上用画笔作画其实类似,想象在画板上作画的过程,你要画一个多大图形(对应View的测量 onMeasure方法),你要画什么样的图

  • Android使用surfaceView自定义抽奖大转盘

    使用surfaceView自定义抽奖大转盘 话不多说,先上效果图 完整代码地址欢迎start 实现思路以及过程 1.首先了解SurfaceView的基本用法,它跟一般的View不太一样,采用的双缓存机制,可以在子线程中绘制View,不会因为绘制耗时而失去流畅性,这也是选择使用SurfaceView去自定义这个抽奖大转盘的原因,毕竟绘制这个转盘的盘块,奖项的图片和文字以及转动都是靠绘制出来的,是一个比较耗时的绘制过程. 2.使用SurfaceView的一般模板样式 一般会用到的成员变量 priva

  • Android实现抽奖转盘实例代码

    本文详述了android抽奖程序的实现方法,程序为一个抽奖大转盘代码,里面定义了很多图形方法和动画. 实现主要功能的SlyderView.java源代码如下: import android.app.Activity; import android.content.Context; import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.Color; import

  • Android实现可点击的幸运大转盘

    之前的项目有一个幸运大转盘的功能,在网上找了很久,都没有合适的方法. 这是效果图,实现目标:十二星座的图片可点击切换选中效果,根据选择不同的星座,实现不同的 方法.之前网上的都是带有指针的,或者可点击改变效果,但是并不知道选择的到底是哪个,即虚拟选择. 实现该功能的主要代码如下: 1.自定义一个布局,存放图片,实现圆形布局. /** * * * CircleMenuLayout.java * * @author wuxiaosu * */ public class CircleMenuLayou

  • Android自定义View实现抽奖转盘

    本文实例为大家分享了Android自定义View实现抽奖转盘的具体代码,供大家参考,具体内容如下 public class LuckCircle extends SurfaceView implements SurfaceHolder.Callback,Runnable { private SurfaceHolder mHolder; private Canvas mCanvas; //用于绘制的线程 private Thread mThread; //线程开关的控制 private boole

  • Android中利用SurfaceView制作抽奖转盘的全流程攻略

    一.概述 今天给大家带来SurfaceView的一个实战案例,话说自定义View也是各种写,一直没有写过SurfaceView,这个玩意是什么东西?什么时候用比较好呢? 可以看到SurfaceView也是继承了View,但是我们并不需要去实现它的draw方法来绘制自己,为什么呢? 因为它和View有一个很大的区别,View在UI线程去更新自己:而SurfaceView则在一个子线程中去更新自己:这也显示出了它的优势,当制作游戏等需要不断刷新View时,因为是在子线程,避免了对UI线程的阻塞. 知

  • 基于Android实现转盘按钮代码

    先给大家展示下效果图: package com.lixu.circlemenu; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.lixu.circlemenu.view.CircleImageView; import com.lixu.ci

  • Android自定义view制作抽奖转盘

    本文实例为大家分享了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; im

  • Android自定义view制作绚丽的验证码

    废话不多说了,先给大家展示下自定义view效果图,如果大家觉得还不错的话,请继续往下阅读. 怎么样,这种验证码是不是很常见呢,下面我们就自己动手实现这种效果,自己动手,丰衣足食,哈哈~ 一. 自定义view的步骤 自定义view一直被认为android进阶通向高手的必经之路,其实自定义view好简单,自定义view真正难的是如何绘制出高难度的图形,这需要有好的数学功底(后悔没有好好学数学了~),因为绘制图形经常要计算坐标点及类似的几何变换等等.自定义view通常只需要以下几个步骤: 写一个类继承

  • android自定义view制作圆形进度条效果

    还是我们自定View的那几个步骤: 1.自定义View的属性 2.在View的构造方法中获得我们自定义的属性 [ 3.重写onMesure ] 4.重写onDraw 1.自定义属性: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CustomTitleView"> <attr name="m

  • Android自定义View制作仪表盘界面

    前言 最近我跟自定义View杠上了,甚至说有点上瘾到走火入魔了.身为菜鸟的我自然要查阅大量的资料,学习大神们的代码,这不,前两天正好在郭神在微信公众号里推送一片自定义控件的文章--一步步实现精美的钟表界面.正适合我这种菜鸟来学习,闲着没事,我就差不多依葫芦画瓢也写了一个自定义表盘View,现在纯粹最为笔记记录下来.先展示下效果图: 下面进入正题 自定义表盘属性 老规矩,先在attrs文件里添加表盘自定义属性 <declare-styleable name="WatchView"&

  • Android自定义View制作动态炫酷按钮实例解析

    普通按钮也就那么几种样式,看着都审美疲劳,先放效果图: 你会不会以为这个按钮是集结了很多动画的产物,我告诉你,并没有.所有的实现都是基于自定义View,采用最底层的onDraw一点一点的画出来的.没有采用一丁点的动画.虽然演示时间很短,但是要完成这么多变化,还是挺吃力. 首先讲解用法: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState)

  • Android自定义View实现圆环带数字百分比进度条

    分享一个自己制作的Android自定义View.是一个圆环形状的反映真实进度的进度条,百分比的进度文字跟随已完成进度的圆弧转动.以下是效果图: 这个自定义View可以根据需要设定圆环的宽度和百分比文字的大小. 先说一下思路:这个View一共分为三部分:第一部分也就是灰色的圆环部分,代表未完成的进度:第二部分是蓝色的圆弧部分,代表已经完成的进度:第三部分是红色的百分比的数字百分比文本,显示当前确切的完成进度. 下面是View的编写思路: ①:定义三个画笔,分别画灰色圆环,蓝色圆弧,红色文字: ②:

  • Android自定义View实现气泡动画

    本文实例为大家分享了Android自定义View实现气泡动画的具体代码,供大家参考,具体内容如下 一.前言 最近有需求制作一个水壶的气泡动画,首先在网上查找了一番,找到了一个文章:Android实现气泡动画 测试了一下发现,如果把它作为子视图的话,会出现小球溢出边界的情况.所以简单的修改了一下. 二.代码 1. 随机移动的气泡 Ball类 /** * @author jiang yuhang * @date 2021-04-18 19:57 */ class Ball { // 半径 @kotl

  • Android自定义View实现APP启动页倒计时效果

    Android自定义View实现APP启动页倒计时效果,供大家参考,具体内容如下 之前也是做过APP启动页的倒计时效果,但是只有文字变化,没有动画效果,这次通过使用自定义View控件来制作一个带有动画效果的倒计时. 倒计时效果的基本思路如下: Canvas提供了绘制弧形的方法,drawArc(),使用这个方法通过定时刷新计算当前弧形的角度,就可以模拟出倒计时的动画效果,同时借助drawText()方法可以实现倒计时文字.(1)继承View(2)使用canvas的drawArc()来绘制弧形,模拟

  • Android自定义view实现雪花特效实例代码

    目录 一.前言 二.创意名 三.效果展示 四.实现步骤 五.编码实现 总结 一.前言 这个冬天,老家一直没有下雨, 正好圣诞节,就想着制作一个下雪的特效. 圣诞祝福:平安夜,舞翩阡.雪花飘,飞满天.心与心,永相伴. 圣诞节是传统的宗教节日,对于基 督徒,那是庆祝耶稣的诞生,纪念耶稣和发扬基督精神.现在整个西方社会都在过圣诞节,像许多宗教节日一样,它已经越来越民俗化了. 尽管如此,圣诞节依然倍受尊重.人们在圣诞快乐中怀有对耶稣的敬仰,欢乐的节庆里含有庄严肃穆的神念.欢度圣诞佳节的人都不拒绝耶稣的教

随机推荐