本文实例为大家分享了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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue,关注w3xue公众号的更多精彩内容。