日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SurfaceView实现抽奖转盘

發布時間:2024/3/26 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SurfaceView实现抽奖转盘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在慕課上看了鴻洋大神的課程,在此記錄下來,小伙伴們可以直接去網站下載素材,傳送門

幸運轉盤類

package com.example.surfaceviewdemo;import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; 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.Log; import android.util.TypedValue; import android.view.SurfaceHolder; import android.view.SurfaceView;/*** Created by FangJu on 2019/12/3.*/ public class LuckyPan extends SurfaceView implements SurfaceHolder.Callback, Runnable {private SurfaceHolder mHolder;private Canvas mCanvas;//用于繪制的線程private Thread t;//控制線程的開關private boolean isRunning;//盤塊的獎項private String[] mStrs = new String[]{"單反相機", "IPAD", "恭喜發財", "IPHONE", "服裝一套", "恭喜發財"};//盤塊的圖片private int[] mImgs = new int[]{R.drawable.danfan, R.drawable.ipad, R.drawable.f040, R.drawable.iphone, R.drawable.meizi, R.drawable.f015};//盤塊的顏色private int[] mColors = new int[]{0xFFFFC300, 0XFFF17E10, 0xFFFFC300, 0XFFF17E10, 0xFFFFC300, 0XFFF17E10};//與圖片對應的Bitmapprivate Bitmap[] mImgsBitmap;//背景private Bitmap mBgBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg2);//盤塊的數量private int mItemCount = 6;//盤塊的范圍private RectF mRange = new RectF();//盤塊的直徑private int mRadius;//盤塊的畫筆private Paint mArcPaint;//盤塊字體的畫筆private Paint mTextPaint;//文字的大小private float mTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics());//滾動的速度private double mSpeed = 0;//開始的角度private volatile float mStartAngle = 0;//轉盤的中心位置private int mCenter;//轉盤的外邊距,以paddLeft為準private int mPadding;//判斷是否點擊了停止按鈕private boolean isShouldEnd;public LuckyPan(Context context) {this(context, null);}public LuckyPan(Context context, AttributeSet attrs) {super(context, attrs);mHolder = getHolder();mHolder.addCallback(this);//可獲得焦點setFocusable(true);setFocusableInTouchMode(true);//設置常量setKeepScreenOn(true);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int width = Math.min(getMeasuredWidth(), getMeasuredHeight());mPadding = getPaddingLeft();//半徑mRadius = width - mPadding * 2;//中心點mCenter = width / 2;setMeasuredDimension(width, width);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {//初始化盤塊的畫筆mArcPaint = new Paint();mArcPaint.setAntiAlias(true);mArcPaint.setDither(true);//初始化字體的畫筆mTextPaint = new Paint();mTextPaint.setColor(Color.WHITE);mTextPaint.setTextSize(mTextSize);//初始化盤塊的范圍mRange = new RectF(mPadding, mPadding, mPadding + mRadius, mPadding + mRadius);//初始化圖片mImgsBitmap = new Bitmap[mItemCount];for (int i = 0; i < mItemCount; i++) {mImgsBitmap[i] = BitmapFactory.decodeResource(getResources(), mImgs[i]);}isRunning = true;t = new Thread(this);t.start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {isRunning = false;}@Overridepublic void run() {while (isRunning) {long start = System.currentTimeMillis();draw();long end = System.currentTimeMillis();if (end - start < 50) {try {Thread.sleep(50 - (end - start));} catch (InterruptedException e) {e.printStackTrace();}}}}private void draw() {try {mCanvas = mHolder.lockCanvas();if (mCanvas != null) {//繪制背景drawBg();//繪制盤塊float tempAngle = mStartAngle;float sweepAngle = 360 / mItemCount;for (int i = 0; i < mItemCount; i++) {//繪制盤塊mArcPaint.setColor(mColors[i]);mCanvas.drawArc(mRange, tempAngle, sweepAngle, true, mArcPaint);//繪制文本drawText(tempAngle, sweepAngle, mStrs[i]);//繪制IcondrawIcon(tempAngle, mImgsBitmap[i]);tempAngle += sweepAngle;}mStartAngle += mSpeed;//如果點擊了停止按鈕if (isShouldEnd) {mSpeed -= 1;}if (mSpeed <= 0) {mSpeed = 0;}}} catch (Exception e) {} finally {if (mCanvas != null)mHolder.unlockCanvasAndPost(mCanvas);}}/*** 點擊啟動旋轉* @param index 獎項的位置*/public void luckyStart(int index) {//計算每一項的角度float angle = 360 / mItemCount;//計算每一項中獎范圍(當前index)//1-> 150~210//0-> 210~270float from = 270 - (index + 1) * angle;float end = from + angle;//設置停下來需要旋轉的距離float targetFrom = 4 * 360 + from;float targetEnd = 4 * 360 + end;float v1 = (float) ((-1 + Math.sqrt(1 + 8 * targetFrom)) / 2);float v2 = (float) ((-1 + Math.sqrt(1 + 8 * targetEnd)) / 2);mSpeed = v1 + Math.random() * (v2 - v1);isShouldEnd = false;}public void luckyEnd() {mStartAngle = 0;isShouldEnd = true;}public boolean isStart() {return mSpeed != 0;}public boolean isShouldEnd() {return isShouldEnd;}/*** 繪制Icon** @param tempAngle* @param mImg*/private void drawIcon(float tempAngle, Bitmap mImg) {//設置圖片的寬度為直徑的1/8int imgWidth = mRadius / 8;//角度=(起始角度+每個盤塊一半的角度)* 1度的大小float angle = (float) ((tempAngle + 360 / mItemCount / 2) * Math.PI / 180);//圖片中心點的坐標int x = (int) (mCenter + mRadius / 2 / 2 * Math.cos(angle));int y = (int) (mCenter + mRadius / 2 / 2 * Math.sin(angle));//確定圖片的位置Rect rect = new Rect(x - imgWidth / 2, y - imgWidth / 2, x + imgWidth / 2, y + imgWidth / 2);mCanvas.drawBitmap(mImg, null, rect, null);}/*** 繪制文本** @param tempAngle* @param sweepAngle* @param mStr*/private void drawText(float tempAngle, float sweepAngle, String mStr) {Path path = new Path();path.addArc(mRange, tempAngle, sweepAngle);//利用水平偏移量讓文字居中float mTextWidth = mTextPaint.measureText(mStr);int hOffset = (int) ((mRadius * Math.PI / mItemCount) / 2 - mTextWidth / 2);//垂直偏移量int vOffset = mRadius / 2 / 6;mCanvas.drawTextOnPath(mStr, path, hOffset, vOffset, mTextPaint);}/*** 繪制背景*/private void drawBg() {Log.d("TAG", "drawBg: ");mCanvas.drawColor(Color.WHITE);mCanvas.drawBitmap(mBgBitmap, null, new Rect(mPadding / 2, mPadding / 2, getMeasuredWidth() - mPadding / 2, getMeasuredHeight() - mPadding / 2), null);} }

測試類

package com.example.surfaceviewdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.view.View; import android.widget.ImageView;public class MainActivity extends AppCompatActivity {private LuckyPan mLuckyPan;private ImageView mStartBtn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mLuckyPan = findViewById(R.id.luckyPan);mStartBtn = findViewById(R.id.start_btn);mStartBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (!mLuckyPan.isStart()) {mLuckyPan.luckyStart(2);mStartBtn.setImageResource(R.drawable.stop);} else {if (!mLuckyPan.isShouldEnd()) {mLuckyPan.luckyEnd();mStartBtn.setImageResource(R.drawable.start);}}}});} }

測試布局

<?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:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/white"tools:context=".MainActivity"><com.example.surfaceviewdemo.LuckyPanandroid:id="@+id/luckyPan"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_centerInParent="true"android:padding="30dp"></com.example.surfaceviewdemo.LuckyPan><ImageViewandroid:id="@+id/start_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:src="@drawable/start" /></RelativeLayout>

總結

以上是生活随笔為你收集整理的SurfaceView实现抽奖转盘的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。