Android 自定義View 抽獎大轉盤(3[完])

在這里將頭兩篇做了一個整合,兩個自定義View變成了一個自定義View

Android 自定義View 抽獎大轉盤(1)
Android 自定義View 抽獎大轉盤(2)
項目github鏈接 https://github.com/yukunkun/RotateView

鎮樓圖

S771011-14425058.jpg

主要是將外圍的圓環在內部設置,增加了轉盤中間的點擊事件,部分修改如下

//大圓
 canvas.drawCircle(MinValue/2,MinValue/2,radius,backgroundPaint);

圓的繪制

  //繪制中間的圖
 Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.node);
 mRect = new Rect(MinValue/2-bitmap.getWidth()/2,MinValue/2-bitmap.getHeight()/2,MinValue/2+bitmap.getWidth()/2,MinValue/2+bitmap.getHeight()/2);
 canvas.drawBitmap(bitmap,null, mRect, null);
 drawSmallCircle(canvas,isYellow,MinValue); 

小圓

  private void drawSmallCircle(Canvas canvas, boolean FirstYellow, int minValue) {
         //位置要在內部,每次的半徑相應的變短一點
         int pointDistance = radius - Util.dip2px(context,9);
         //每次增加20度,也就是能夠得到18個點
         for(int i=0;i<=360;i+=20){
             //每次獲取到圓心的位置,由i控制位置
             int x = (int) (pointDistance * Math.sin(Util.change(i))) + minValue/2;
             int y = (int) (pointDistance * Math.cos(Util.change(i))) + minValue/2;
 
             //兩個不同顏色圓
             if(FirstYellow)
                 canvas.drawCircle(x,y,Util.dip2px(context,4),yellowPaint);
             else
                 canvas.drawCircle(x,y,Util.dip2px(context,4),whitePaint);
             FirstYellow = !FirstYellow;
         }
     }

這些方法被抽離出來了,圓盤的內圓半徑有變化,每個圖片的定位有點變化

初始化半徑時變小了

   //內邊距
    final int paddingLeft = getPaddingLeft()+Util.dip2px(context,ringLength);
    final int paddingRight = getPaddingRight()-Util.dip2px(context,ringLength);
    final int paddingTop = getPaddingTop()+Util.dip2px(context,ringLength);
    final int paddingBottom = getPaddingBottom()-Util.dip2px(context,ringLength);

初始化圖片的中心位置,有點偏移,否者位置不對,有點遮擋文字

//確定圖片在圓弧中 中心點的位置
float x = (float) (xx + (mRadius /2 + mRadius/12-Util.dip2px(context,ringLength))* Math.cos(angle));
float y = (float) (yy + (mRadius /2 +mRadius/12-Util.dip2px(context,ringLength)) * Math.sin(angle));

下面是點擊中間的圖片的觸摸事件

/**
     * 點擊事件,點擊中心就開始動畫
     * @param event
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                float x = event.getX();
                float y = event.getY();
                //點擊了中間位置
                if(x>mRect.left&&x<mRect.right&&y>mRect.top&&y<mRect.bottom){
                    startAnimation(pos);
                }
                break;
            case MotionEvent.ACTION_MOVE:
                break;
        }
        return super.onTouchEvent(event);
    }

如上所示,將中間的圖片位置獲取到,由MotionEvent.ACTION_DOWN來確定點擊

效果圖所開頭所示。有需要的話,還可以在這個上面修改。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,284評論 25 708
  • 國內自定義View的文章汗牛充棟,但是,即便是你全部看完也未必掌握這一知識(實際上,我也看了很多,但是一旦涉及自定...
    SnowDragonYY閱讀 1,652評論 3 36
  • 這次不說我自己的故事,說說其他人美好的事兒 今兒周末,恰逢幾個發小明天都休息,所以慣例性的,拉上語音 打打游戲調調...
    康汀閱讀 465評論 0 1
  • 這兩天抽空看了這本《嫌疑人X的獻身》,因為聽說電影不錯,對這個故事產生了興趣,所以買了實體書看。我知道,東野圭吾的...
    銀葉書生閱讀 404評論 0 2
  • 折騰 從 2015 到現在,短短的三年內,幾乎每年折騰一下工作流的 “ 更新換代 ”。從最早開始使用 Grunt ...
    lilijialiang閱讀 588評論 0 0