android自定义抽奖转盘
生活随笔
收集整理的這篇文章主要介紹了
android自定义抽奖转盘
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
項目中有用到抽獎轉盤,網上找的demo有些不合設計的要求(不能隨意添加轉盤中item的個數,不能以上層view滾動等),于是自己嘗試寫了個自定義的抽獎轉盤,方便以在別的項目中更改使用,大致的效果如下圖:
這是為點擊抽獎之前的效果
整體的思路是下邊是一個可以任意添加item的自定義的view,上部份是一張圖片,點擊圖片的時候讓圖片開始Rotate動畫效果,轉動到特定的item那里
1.自定義view:
Turnplate package com.example.hp.loading;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.graphics.Typeface; import android.os.Build; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.WindowManager;import java.util.ArrayList; import java.util.List;/** * Created by hp on 2016/9/5. * 轉盤 */ public class Turnplate extends View{private Context context;private final float StrarLocation=270;private Paint paint;private float mRadios;//繪制的角度 private List<String> listText;//顯示的文字 private List<Float>listRadios;//每個特定弧度的中心位置 private int mCount;//繪制的次數 private List<Integer>listColor;//每個弧度的顏色(最大數目10個) public Turnplate(Context context, AttributeSet attrs) {super(context, attrs);this.context=context;//此構造方法會在xml生成時調用,而不是在Activity使用中調用paint=new Paint();paint.setAntiAlias(true);Path path=new Path();//初始化路徑pathlistText=new ArrayList<>();listRadios=new ArrayList<>();listColor=new ArrayList<>();//測試用的顏色,方便給每個item添加不同顏色listColor.add(0xFF0b87f4);//色值不能在此引用xml中的數據,否則不起效果,必須以16進制形式添加listColor.add(0xFFc316de);listColor.add(0xFFcbce25);listColor.add(0xFFf47378);listColor.add(0xFF18dfd8);listColor.add(0xFF7d1ed1);listColor.add(0xFFe6a1ef);listColor.add(0xFFfdd700);listColor.add(0xfba0ec25);}public Turnplate(Context context) {super(context);}@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);if (listText!=null&&listText.size()>0){//初始化繪制文字的畫筆Paint mTextPaint=new Paint();mTextPaint.setColor(Color.WHITE);mTextPaint.setAntiAlias(true);mTextPaint.setDither(true);if(Build.VERSION.SDK_INT>20){mTextPaint.setLetterSpacing(0.1f);}mTextPaint.setTextAlign(Paint.Align.CENTER);mTextPaint.setTextSize(getResources().getDimension(R.dimen.texSize_A)); Typeface typeface=Typeface.create(Typeface.MONOSPACE , Typeface.NORMAL);mTextPaint.setTypeface(typeface);float startRadios=270-mRadios/2;RectF rectF=new RectF(0,0,canvas.getWidth(),canvas.getHeight());for (int i=0;i<listText.size();i++){if (i<listColor.size()-1){paint.setColor(listColor.get(i));}else {paint.setColor(Color.WHITE);}Path path=new Path();path.addArc(rectF, startRadios, mRadios); float textWidth = mTextPaint.measureText(listText.get(i));Paint.FontMetrics metrics=mTextPaint.getFontMetrics();float assent=metrics.ascent;float descent=metrics.descent;float height=(descent-assent); canvas.drawArc(rectF, startRadios, mRadios, true, paint);canvas.drawTextOnPath(listText.get(i),path,0,height,mTextPaint);startRadios+=mRadios;}//測試用 if (listRadios!=null&&listRadios.size()>0){for (int i=0;i<listRadios.size();i++){Log.i("listRadios--i--"+i,"==="+listRadios.get(i));}} }}@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //view的寬高度相等,大小為屏幕寬度的3/4WindowManager manager= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);int width=manager.getDefaultDisplay().getWidth();width-=width/4;setMeasuredDimension(width, width);}/* * 設置顯示的文字 * */ public void setText(String[] text){try {mCount=text.length;if (mCount<1){mCount=1;}for (int i=0;i<text.length;i++){listText.add(text[i]);}mRadios=360.0f/mCount;//每個item所占的弧度Log.i("mRadios===",""+mRadios);Log.i("mCount===",""+mCount);//-------------------- for (int i=0;i<listText.size();i++) {float start = 270 + mRadios * i;if (start < 360) {listRadios.add(start);} else {listRadios.add(start - 360);}}invalidate();}catch (Exception e){Log.e("Turnplate-setText-","傳入的字符串數組為空,請確認");}}/* * 獲取每個環的弧度 * */ public float getMyRadios(){return mRadios;}public float getStartRadios(){//獲取開始的角度 return StrarLocation;}//獲取所有選項中心位置的弧度數目 public List<Float>getRadioList(){return listRadios;} } 2.xml中引用自定義的view <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.hp.loading.MainActivity"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"><com.example.hp.loading.Turnplate android:background="#aaeeaa" android:id="@+id/turnplate" android:layout_gravity="center" android:layout_width="100dp" android:layout_height="100dp" /><ImageView android:id="@+id/image" android:clickable="true" android:onClick="rotate" android:src="@mipmap/choujiang" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </FrameLayout> </RelativeLayout> 3.Activity中初始化view并給轉盤中的view添加數據源 package com.example.hp.loading;import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView; import android.widget.Toast;import java.util.ArrayList; import java.util.List; import java.util.Random;public class MainActivity extends AppCompatActivity {private Turnplate turnplate;private ImageView image;private RotateAnimation anim;private float rot;private ImageView imageA;private Float StartRadios;//轉盤起始的位置 private int CurrentRadiosId;//轉盤當前所處的位置 private List<Float> listRadios;private List<Float>listImaRadios;private int round;//用于產生隨機數 private String[]text={"謝謝抽獎","中獎1元","中獎2元","中獎5元","中獎10元","中獎50元","中獎100元"}; // @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);turnplate= (Turnplate) findViewById(R.id.turnplate);image= (ImageView) findViewById(R.id.image); // imageA= (ImageView) findViewById(R.id.imageA); round=text.length;turnplate.setText(text);StartRadios=turnplate.getStartRadios();CurrentRadiosId=0;listRadios=new ArrayList<>();listRadios=turnplate.getRadioList();listImaRadios=new ArrayList<>();for (int i=0;i<listRadios.size();i++){float rado=listRadios.get(i)-270;if (rado>0|rado==0){listImaRadios.add(rado);}else {listImaRadios.add(360+rado);}Log.i("---------listImag",""+listImaRadios.get(i));}}@Override protected void onStart() {super.onStart();}/* * 轉動的view * */ public void rotate(View view) {//產生0-round之間的隨機數 image.setClickable(false);int sc=new Random().nextInt(round); // Log.i("產生的隨機數---"+sc,"item的總數目--"+round); Log.i("當前item的id===" + CurrentRadiosId, "結束的item的id==" + sc);rotateTo(CurrentRadiosId, sc);//從當前的id旋轉到sc CurrentRadiosId=sc;//記錄新的當前id }private void rotateTo(int currentId, int rotateId) {float curRadio=listRadios.get(currentId);//當前的item的弧度 float rotaRadio=listRadios.get(rotateId);//結束的item的弧度 // if (curRadio-rotaRadio>0){ // rot=360-curRadio+rotaRadio; // } // else if (curRadio-rotaRadio==0){ // rot=0; // } // else { // rot=rotaRadio-curRadio; // } float rotateRadio=360*4+listImaRadios.get(rotateId);//總的旋轉度數 // Log.i("開始轉動的弧度-qq====" + listImaRadios.get(currentId), "轉動的弧度====" + rot); // Log.i("開始轉動的item位置"+currentId,"結束時的item位置"+rotateId); anim=new RotateAnimation(listImaRadios.get(currentId),rotateRadio,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);anim.setDuration(1000);anim.setFillAfter(true);anim.setAnimationListener(new Animation.AnimationListener() {@Override public void onAnimationStart(Animation animation) {}@Override public void onAnimationEnd(Animation animation) {image.setClickable(true);Toast.makeText(MainActivity.this,""+text[CurrentRadiosId],Toast.LENGTH_SHORT).show(); // Log.i("轉動結束后的當前item===", "" + CurrentRadiosId); Log.i("----------","---------------------------------------------");}@Override public void onAnimationRepeat(Animation animation) {}});image.startAnimation(anim);} }
總結
以上是生活随笔為你收集整理的android自定义抽奖转盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 录制视频课程探索
- 下一篇: 单机单点 Rke2 Single 升级到