国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

SurfaceView的基本用法模板自定義實現抽獎盤

2019-11-09 18:44:02
字體:
來源:轉載
供稿:網友

一概述 SurfaceView是在子線程中進行繪制的,SurfaceHolder提供Canvas并管理SurfaceView的生命周期。

二、模板編程思路 1、繼承SurfaceView,聲明一個繪制的線程,獲取SurfaceHolder,控制線程的變量,Canvas。 2、構造方法中對變量進行初始化,SurfaceHolder提供Canvas與生命周期的CallBack; 3、在surfaceCreated方法中啟動線程繪制 4、surfaceDestroyed方法中停止線程

1、SurfaceViewTempLate類

package template;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceView;public class SurfaceViewTempLate extends SurfaceView implements SurfaceHolder.Callback,Runnable { PRivate SurfaceHolder holder; private Canvas mCanvas; //用于繪制的線程 private Thread t; //線程控制開關 private boolean isRunning = false; public SurfaceViewTempLate(Context context) { this(context,null); } public SurfaceViewTempLate(Context context, AttributeSet attrs) { super(context, attrs); holder = getHolder(); holder.addCallback(this); //設置可獲得焦點 setFocusable(true); setFocusableInTouchMode(true); //設置常量 setKeepScreenOn(true); } @Override public void surfaceCreated(SurfaceHolder holder) { isRunning = true; t = new Thread(this); t.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { isRunning = false; } @Override public void run() { //不斷進行繪制... while(isRunning) { draw(); } } private void draw() { try { mCanvas = holder.lockCanvas(); if (mCanvas != null) { } }catch (Exception e) { }finally { if (mCanvas != null) { holder.unlockCanvasAndPost(mCanvas); } } }}

三、PackPan的實現 編碼思路: 1、拷貝模板SurfaceViewTempLate類修改下名字 2、聲明變量 3、重寫下onMeasure方法,并初始化布局大小 4、surfaceCreated類中初始化變量 5、在線程中進行繪制背景,盤塊,文字,圖片

2、LankPan類

package app.kuxiao.com.demo.lack;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;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;public class LackPan extends SurfaceView implements SurfaceHolder.Callback, Runnable { private SurfaceHolder holder; private Canvas mCanvas; //用于繪制的線程 private Thread t; //線程控制開關 private boolean isRunning = false; //盤塊的圖片 private int[] lack_icons = new int[]{R.drawable.danfan, R.drawable.f015, R.drawable.ipad, R.drawable.f040, R.drawable.iphone, R.drawable.meizi}; //盤塊的文字 private String[] lack_text = new String[]{"單反", "恭喜發財", "Ipad", "恭喜發財", "iPhone", "服裝一套"}; private int[] lack_color = new int[]{0xffffc300, 0xfff17e01, 0xffffc300, 0xfff17e01, 0xffffc300, 0xfff17e01}; //盤塊的數量 private int lack_count = 6; private Bitmap[] lack_bitmap = null; //范圍 private RectF mRange = null; //整個盤塊的直徑 private int mRadius = 0; //盤狀的畫筆 private Paint mPanPaint; //文字的畫筆 private Paint mTextPaint; //旋轉的速度 private double mSpeed = 0; //開始的角度 private volatile int mStartAngle = 0; //是否點擊停止 private boolean isOnClickStop = false; //轉盤的中心 private int mCentre = 0; // private int mPadding; //轉盤的背景圖 private Bitmap bg_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg2); //設置文字的大小 private float mTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); public LackPan(Context context) { this(context, null); } public LackPan(Context context, AttributeSet attrs) { super(context, attrs); holder = getHolder(); holder.addCallback(this); //設置可獲得焦點 setFocusable(true); setFocusableInTouchMode(true); //設置常量 setKeepScreenOn(true); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //獲取控件的高度與寬度之間的最小值 int width = Math.min(getMeasuredWidth(), getMeasuredHeight()); //以左邊距為準設置邊距 mPadding = getPaddingLeft(); //設置直徑 mRadius = width - 2 * mPadding; //設置中心點 mCentre = width / 2; //設置下View的尺寸 setMeasuredDimension(width, width); } @Override public void surfaceCreated(SurfaceHolder holder) { isRunning = true; //初始化盤的畫筆 mPanPaint = new Paint(); //設置普通顯示 mPanPaint.setAntiAlias(true); //設置高頻 mPanPaint.setDither(true); //初始化文字畫筆 mTextPaint = new Paint(); mTextPaint.setTextSize(mTextSize); mTextPaint.setColor(0xffffffff); //初始化繪制的范圍 mRange = new RectF(mPadding, mPadding, mPadding + mRadius, mPadding + mRadius); //初始化圖片 lack_bitmap = new Bitmap[lack_count]; for (int i = 0; i < lack_count; i++) { lack_bitmap[i] = BitmapFactory.decodeResource(getResources(), lack_icons[i]); } t = new Thread(this); t.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { isRunning = false; } @Override public void run() { //不斷進行繪制... while (isRunning) { long start = System.currentTimeMillis(); draw(); long end = System.currentTimeMillis(); //強制繪制的時間為50毫秒以上 if (end - start <= 50) { try { Thread.sleep(50 - (end - start)); } catch (InterruptedException e) { e.printStackTrace(); } } } } private void draw() { try { mCanvas = holder.lockCanvas(); if (mCanvas != null) { //繪制背景 drawBg(); //繪制盤塊 drawPan(); } } catch (Exception e) { } finally { if (mCanvas != null) { holder.unlockCanvasAndPost(mCanvas); } } } private void drawPan() { float startAngle = mStartAngle; float sweedAngle = 360 / lack_count; for (int i = 0; i < lack_count; i++) { mPanPaint.setColor(lack_color[i]); //繪制背景扇形 mCanvas.drawArc(mRange, startAngle, sweedAngle, true, mPanPaint); //繪制文字 drawText(startAngle, sweedAngle, lack_text[i]); //繪制圖片 drawIcon(startAngle, lack_bitmap[i]); startAngle += sweedAngle; } mStartAngle += mSpeed; if (isOnClickStop) { mSpeed--; if (mSpeed < 0) { mSpeed = 0; isOnClickStop = false; } } } /** * 繪制圖標 * * @param startAngle * @param bitmap */ private void drawIcon(float startAngle, Bitmap bitmap) { //圖片的寬度 int icon_width = mRadius / 8; float angle = (float) ((startAngle + 360 / lack_count / 2) * Math.PI / 180); //極坐標換算公式 x = RCOSα // y = RSinα 求得圖片的中心位置 int x = (int) (mCentre + mRadius / 4 * Math.cos(angle)); int y = (int) (mCentre + mRadius / 4 * Math.sin(angle)); //設置圖片的范圍 Rect rect = new Rect(x - icon_width / 2, y - icon_width / 2, x + icon_width / 2, y + icon_width / 2); mCanvas.drawBitmap(bitmap, null, rect, null); } /** * 繪制文字 * * @param startAngle * @param sweedAngle * @param s */ private void drawText(float startAngle, float sweedAngle, String s) { Path path = new Path(); path.addArc(mRange, startAngle, sweedAngle); //獲取文字的長度 float textwidth = mTextPaint.measureText(s); float hOffset = (float) (sweedAngle * Math.PI / 180 / 4 * mRadius - textwidth / 2); float vOffset = mRadius / 2 / 4; mCanvas.drawTextOnPath(s, path, hOffset, vOffset, mTextPaint); } /** * 繪制背景 */ private void drawBg() { mCanvas.drawColor(0xffffffff); mCanvas.drawBitmap(bg_bitmap, null, new RectF(mPadding / 2, mPadding / 2, getMeasuredHeight() - mPadding / 2, getMeasuredHeight() - mPadding / 2), null); } /** * 開始轉動 * @param mSpeed */ public void start(int mSpeed,int index) { this.mSpeed = mSpeed; float angle = 360/lack_count; //當前項的中獎范圍 //0的話 正中獎是旋轉240度,可以偏差30度 所以為 210-270 //1的話 正中獎是旋轉180,180-30~180+30 (150-210) //2 float start = 270 - (index + 1 )* angle + 360*3;//轉4圈 float end = start + angle; double mSpeed1 = (-1 +(Math.sqrt(1+4*2*start)))/2; double mSpeed2 = (-1 +(Math.sqrt(1+4*2*end)))/2; Log.i("LackPan","mSpeed1的值為" + mSpeed1); Log.i("LackPan","mSpeed2的值為" + mSpeed2); //設置速度為mSpeed1~mSpeed2中的一個隨機數 this.mSpeed = mSpeed1; //重新設置開始角度為0; } /** * 停止轉動 */ public void stop() { mStartAngle = 0; isOnClickStop = true; /* final Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { mSpeed--; Log.i("LackPan", "mSpeed的值為" + mSpeed); if (mSpeed <= 0) { mSpeed = 0; timer.cancel(); } } }, 0, 20);*/ }}

2、MainActivity類

package app.kuxiao.com.demo.lack;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { private LackPan mLackPan = null; private ImageView mImageView = null; private boolean isOnclickStart = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); mLackPan = (LackPan) findViewById(R.id.lackPan); mImageView = (ImageView) findViewById(R.id.image_start); mImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isOnclickStart) { mLackPan.stop(); isOnclickStart = false; mImageView.setImageResource(R.drawable.start); }else { isOnclickStart = true; mImageView.setImageResource(R.drawable.stop); mLackPan.start(50,0); } } }); }}

通過改變每一次繪制的初始角度,讓轉盤運動。


上一篇:你好,2017

下一篇:OC-雜談篇(1)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南溪县| 内黄县| 闸北区| 静乐县| 小金县| 丹东市| 唐河县| 大英县| 达拉特旗| 武隆县| 五原县| 新干县| 临夏市| 治多县| 尼玛县| 乃东县| 龙口市| 石首市| 旬阳县| 繁昌县| 绥江县| 海城市| 托里县| 临安市| 阳新县| 马关县| SHOW| 新疆| 大冶市| 濮阳县| 惠东县| 德州市| 安福县| 通道| 石门县| 潞西市| 齐齐哈尔市| 什邡市| 福海县| 南华县| 广西|