Android實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤實(shí)例代碼
本文詳述了android抽獎(jiǎng)程序的實(shí)現(xiàn)方法,程序?yàn)橐粋€(gè)抽獎(jiǎng)大轉(zhuǎn)盤代碼,里面定義了很多圖形方法和動(dòng)畫。
實(shí)現(xiàn)主要功能的SlyderView.java源代碼如下:
import android.app.Activity; import android.content.Context; import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorMatrixColorFilter; import android.graphics.EmbossMaskFilter; import android.graphics.MaskFilter; import android.graphics.Paint; import android.graphics.PorterDuffXfermode; import android.graphics.Paint.Style; import android.graphics.PorterDuff.Mode; import android.graphics.Path; import android.graphics.RadialGradient; import android.graphics.RectF; import android.graphics.Shader.TileMode; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; public class SlyderView extends View{ public SlyderView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } public SlyderView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public SlyderView(Context context) { super(context); init(context); } /** * 屏幕寬度 */ private int screenW; /** * 屏幕的高度 */ private int screenH; /** * 分割的度數(shù) */ private int [] drgrees = {20,50,40,90,70,40,50}; /*** * 分割的文字 */ private String [] strs = {"level1","level2","level3","level4","level5","level6","level7"}; /** * 分割的顏色 */ private int [] colos = new int[] { 0xfed9c960, 0xfe57c8c8, 0xfe9fe558, 0xfef6b000, 0xfef46212, 0xfecf2911, 0xfe9d3011 }; /** * 畫筆 */ private Paint paint; /** * 文字的大小 */ private float textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 15, getResources().getDisplayMetrics()); /** * 文字的顏色 */ private int textcolor = Color.WHITE; /** * 園的半徑 */ private float radius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 100, getResources().getDisplayMetrics()); /** * 畫文字的距離 */ private float textdis = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 80, getResources().getDisplayMetrics()); /** * 畫箭頭的大小 */ private float roketSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics()); private float initDegress = 0; /** * 圓心 */ private float centerX; /** * 圓心 */ private float centerY; /** * 立體邊緣 */ private MaskFilter filter = new EmbossMaskFilter(new float[] { 1, 1, 1 },0.4f, 6, 3.5f); private MaskFilter outerFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.OUTER); private MaskFilter innerFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.INNER); @SuppressWarnings("deprecation") private void init(Context context){ paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Style.FILL); paint.setColor(Color.WHITE); screenW = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth(); screenH = ((Activity)context).getWindowManager().getDefaultDisplay().getHeight(); int[] colores = new int[3]; colores[0] = Color.rgb(0xfF, 0x99, 0x00); colores[1] = Color.rgb(0xff, 0xff, 0x00); colores[2] = Color.rgb(0xff, 0x99, 0x00); float[] positions = new float[3]; positions[0] = 0.0f; positions[1] = 0.5f; positions[2] = 1.0f; gradient = new RadialGradient(centerX, centerY, radius/5, colores, positions, TileMode.CLAMP); } /** * 繪制三角箭頭 */ private Path path = new Path(); /** * 繪制矩形框 */ private RectF oval; /** * 外圓內(nèi)陰影矩陣 */ private ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(new float[]{ 1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,-1,255 }); @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); centerX = screenW/2; centerY = screenH/2; oval = new RectF(centerX-radius,centerY-radius,centerX+radius,centerY+radius); float start = 0; paint.setColor(Color.rgb(0xdd, 0xdd, 0xdd)); paint.setAlpha(127); canvas.drawCircle(centerX, centerY, radius+10, paint); paint.setAlpha(255); //畫扇形 paint.setAntiAlias(true); for(int i=0;i<drgrees.length;i++){ float sweepAngle = drgrees[i]; float startAngle = start; paint.setColor(colos[i%colos.length]); canvas.drawArc(oval, startAngle, sweepAngle, true, paint); start += drgrees[i]; } //畫文字 paint.setColor(textcolor); paint.setAntiAlias(true); paint.setTextSize(textSize); paint.setTextAlign(Paint.Align.RIGHT); start = 0; for(int i=0;i<drgrees.length;i++){ canvas.save(); canvas.rotate(start+drgrees[i]/2, centerX, centerY); canvas.drawText(strs[i], centerX+textdis, centerY, paint); canvas.restore(); start += drgrees[i]; } int saveCount = canvas.save(); //畫外層立體效果 paint.setColorFilter(colorFilter); canvas.saveLayer(oval,paint,Canvas.ALL_SAVE_FLAG); paint.setColorFilter(null); canvas.drawARGB(255, 0, 0, 0); paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); canvas.drawCircle(centerX, centerY, radius, paint); paint.setXfermode(null); paint.setMaskFilter(innerFilter); paint.setColor(Color.argb(0xff, 0, 0, 0)); canvas.drawCircle(centerX, centerY, radius, paint); paint.setMaskFilter(null); canvas.restoreToCount(saveCount); //畫內(nèi)圓和內(nèi)園效果 canvas.save(); paint.setColor(Color.argb(0xff, 0, 0, 0)); paint.setAntiAlias(true); paint.setMaskFilter(outerFilter); canvas.rotate(initDegress, centerX, centerY); canvas.drawCircle(centerX, centerY, radius/3, paint); paint.setMaskFilter(null); paint.setColor(Color.WHITE); canvas.drawCircle(centerX, centerY, radius/3, paint); //畫三角型疊加當(dāng)箭頭 path.moveTo(centerX-radius/3, centerY); path.lineTo(centerX, centerY-radius/3-roketSize); path.lineTo(centerX+radius/3, centerY); path.close(); canvas.drawPath(path, paint); canvas.restore(); paint.setMaskFilter(filter); paint.setColor(Color.GREEN); paint.setShader(gradient); canvas.drawCircle(centerX, centerY, radius/5, paint); paint.setMaskFilter(null); paint.setShader(null); //重繪調(diào)整三角的指向達(dá)到滾動(dòng)的效果,現(xiàn)實(shí)項(xiàng)目中可不能這樣用的,效率太低下了,拆分View用動(dòng)畫完成滾動(dòng)才是王道 if(isRunning){ if(initDegress>=360){ initDegress = 0; } initDegress +=4; invalidate(); } if(isStoping){ if(initDegress<=360){ initDegress+=4; invalidate(); }else{ if(initDegress-360<stop_degress){ initDegress+=2; invalidate(); } } } } private boolean isRunning = false; private boolean isStoping = false; private int stop_degress =90; /** * 漸變 */ private RadialGradient gradient; public void play(){ isRunning = true; invalidate(); } public void stop(int count){ for(int i =0;i<=count;i++){ if(i == count){ stop_degress +=drgrees[i]/2; }else{ stop_degress +=drgrees[i]; } } isStoping = true; isRunning = false; invalidate(); } }
- Android實(shí)現(xiàn)指針刻度轉(zhuǎn)盤
- Android自定義轉(zhuǎn)盤菜單效果
- Android實(shí)現(xiàn)可點(diǎn)擊的幸運(yùn)大轉(zhuǎn)盤
- Android自定義view制作抽獎(jiǎng)轉(zhuǎn)盤
- Android自定義View實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤
- Android自定義View實(shí)現(xiàn)QQ運(yùn)動(dòng)積分轉(zhuǎn)盤抽獎(jiǎng)功能
- Android使用surfaceView自定義抽獎(jiǎng)大轉(zhuǎn)盤
- Android中利用SurfaceView制作抽獎(jiǎng)轉(zhuǎn)盤的全流程攻略
- 基于Android實(shí)現(xiàn)轉(zhuǎn)盤按鈕代碼
- android實(shí)現(xiàn)簡單的活動(dòng)轉(zhuǎn)盤
相關(guān)文章
Android入門之SubMenu的實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了Android如何實(shí)現(xiàn)SubMenu子菜單的效果,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Android有一定的幫助,感興趣的可以了解一下2022-11-11ListView-添加item的事件監(jiān)聽實(shí)例
下面小編就為大家?guī)硪黄狶istView-添加item的事件監(jiān)聽實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07使用Flutter開發(fā)的抖音國際版實(shí)例代碼詳解
這篇文章主要介紹了使用Flutter開發(fā)的抖音國際版,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Android基于MLKit實(shí)現(xiàn)條形碼掃碼的代碼示例
這篇文章將借助開源庫?MLKit?實(shí)現(xiàn)條形碼掃描,對于商品條形碼也可以很好地識別成功,該庫的使用內(nèi)容非常豐富,除了條碼識別,還有文字識別、圖像標(biāo)記、人臉檢測等等,本文篇文章就只介紹最基本的條形碼掃描使用,需要的朋友可以參考下2023-08-08深入理解TextView實(shí)現(xiàn)Rich Text--在同一個(gè)TextView設(shè)置不同字體風(fēng)格
本篇文章是對Android中在同一個(gè)TextView中設(shè)置不同的字體風(fēng)格進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android實(shí)現(xiàn)手機(jī)壁紙改變的方法
這篇文章主要介紹了Android實(shí)現(xiàn)手機(jī)壁紙改變的方法,以完整實(shí)例形式分析了Android手機(jī)壁紙改變的方法,包括頁面布局及屬性設(shè)置的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09Android自定義ScrollView實(shí)現(xiàn)放大回彈效果
這篇文章主要為大家詳細(xì)介紹了Android自定義ScrollView實(shí)現(xiàn)放大回彈效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Android中ScrollView嵌套GridView顯示不全解決方法
這篇文章主要介紹了Android中ScrollView嵌套GridView顯示不全解決方法的相關(guān)資料,需要的朋友可以參考下2017-04-04