欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android實現(xiàn)圖片隨手指旋轉(zhuǎn)功能

 更新時間:2018年05月05日 13:55:29   作者:WillenWu  
這篇文章主要為大家詳細介紹了Android實現(xiàn)圖片隨手指旋轉(zhuǎn)功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Android實現(xiàn)圖片隨手指旋轉(zhuǎn)功能的具體代碼,供大家參考,具體內(nèi)容如下

在View中進行重繪,主要是通過計算角度及距離來實現(xiàn)。實現(xiàn)類代碼如下:

package com.example.roatedemo; 
 
import java.util.Calendar; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
 
public class RotateView extends View { 
  private Paint mPaint = new Paint(); 
  private Bitmap bitmaplittele;//中間不動的圖片 
  private Bitmap bitmapBig;//隨手指轉(zhuǎn)動的圖片 
  private Bitmap bitmapOut;//外圍不動的圖片 
  // 圓心坐標 
  private float mPointX = 0, mPointY = 0; 
 
  private int flag = 0; 
  // 半徑 
  private int mRadius = 0; 
  // 旋轉(zhuǎn)角度 
  private int mAngle = 0; 
  private int beginAngle = 0, currentAngle = 0; 
  private String TAG = "NewView"; 
  int bitMap[] = { R.drawable.circle0, R.drawable.circle1, R.drawable.circle2 }; 
  int imageIndex = 0; 
  boolean isUp = false,isTouch=false; 
  Context mContext; 
  RotateViewListener listener; 
  long beginTime,endTime; 
  Calendar now; 
 
  public RotateView(Context context, int px, int py, int radius,RotateViewListener listener) { 
    super(context); 
    mContext = context; 
    this.listener = listener; 
    mPointX = px; 
    mPointY = py; 
    mRadius = radius; 
    bitmaplittele = BitmapFactory.decodeResource(getResources(), 
        R.drawable.a1_pointer).copy(Bitmap.Config.ARGB_8888, true); 
    bitmapBig = BitmapFactory.decodeResource(getResources(), bitMap[0]) 
        .copy(Bitmap.Config.ARGB_8888, true); 
    bitmapOut = BitmapFactory.decodeResource(getResources(), 
        R.drawable.bigcir).copy(Bitmap.Config.ARGB_8888, true); 
    setBackgroundResource(R.drawable.back); 
    Log.e(TAG, "RotateViewBegin");    
  } 
 
  @Override 
  public boolean dispatchTouchEvent(MotionEvent e) { 
    switch (e.getAction() & MotionEvent.ACTION_MASK) { 
    case MotionEvent.ACTION_DOWN: 
      now = Calendar.getInstance(); 
      beginTime = now.getTimeInMillis(); 
      beginAngle = computeCurrentAngle(e.getX(), e.getY()); 
      isUp = false; 
      //如果點擊觸摸范圍在圈外,則不處理 
      if (getDistance(e.getX(), e.getY())>bitmapOut.getWidth()/2) { 
        isTouch=false; 
      }else { 
        isTouch=true; 
      } 
      return true; 
    case MotionEvent.ACTION_MOVE: 
      if (!isTouch) { 
        return true; 
      } 
      currentAngle = computeCurrentAngle(e.getX(), e.getY()); 
      invalidate(); 
      return true; 
    case MotionEvent.ACTION_UP: 
      isUp = true; 
      if (!isTouch) { 
        return true; 
      } 
      now = Calendar.getInstance(); 
      endTime = now.getTimeInMillis(); 
      if (SetClick(e.getX(), e.getY())) { 
        return true; 
      }       
      if (mAngle > 0) { 
        int count = mAngle / 120 + (mAngle % 120 > 60 ? 1 : 0); 
        imageIndex = (imageIndex + count) % 3; 
      } else if (mAngle < 0) { 
        mAngle = -mAngle; 
        int count = mAngle / 120 + (mAngle % 120 > 60 ? 1 : 0); 
        imageIndex = (imageIndex + 3 - count) % 3; 
      } 
      bitmapBig = BitmapFactory.decodeResource(getResources(), 
          bitMap[imageIndex]).copy(Bitmap.Config.ARGB_8888, true); 
      bitmapBig = adjustPhotoRotation(bitmapBig, imageIndex * 120); 
      invalidate(); 
      if (mAngle >= 60) { 
        listener.onModChange(imageIndex); 
      }       
      return true; 
    } 
 
    return false; 
  } 
 
  @Override 
  public void onDraw(Canvas canvas) { 
    // Log.i(TAG, "onDraw"); 
    // 大圓 
    drawInCenter(canvas, bitmapOut, mPointX, mPointY, TAG); 
    // 外圈 
    if (isUp) { 
      mAngle = 0; 
    } else { 
      mAngle = currentAngle - beginAngle; 
    } 
 
    Bitmap tempBig = adjustPhotoRotation(bitmapBig, mAngle); 
    // Log.i(TAG, "mAngle:"+mAngle); 
    drawInCenter(canvas, tempBig, mPointX, mPointY + 10, TAG); 
    // 小圓(中間的圓心) 
    drawInCenter(canvas, bitmaplittele, mPointX, mPointY - 10, TAG); 
  } 
 
  Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) { 
    if (orientationDegree == 0) { 
      return bm; 
    } 
    Matrix m = new Matrix(); 
    m.setRotate(orientationDegree, (float) bm.getWidth() / 2, 
        (float) bm.getHeight() / 2); 
 
    try { 
      Bitmap bm1 = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
          bm.getHeight(), m, true); 
 
      return bm1; 
 
    } catch (OutOfMemoryError ex) { 
    } 
 
    return null; 
 
  } 
 
  private void drawInCenter(Canvas canvas, Bitmap bitmap, float left, 
      float top, String text) { 
    canvas.drawBitmap(bitmap, left - bitmap.getWidth() / 2, 
        top - bitmap.getHeight() / 2, null); 
  } 
 
  // 子控件位置改變重新計算角度 
  private int computeCurrentAngle(float x, float y) { 
    // 根據(jù)圓心坐標計算角度 
    float distance = (float) Math 
        .sqrt(((x - mPointX) * (x - mPointX) + (y - mPointY) 
            * (y - mPointY))); 
    int degree = (int) (Math.acos((x - mPointX) / distance) * 180 / Math.PI); 
    if (y < mPointY) { 
      degree = -degree; 
    } 
    if (degree < 0) { 
      degree += 360; 
    } 
 
    // Log.i("RoundSpinView", "x:" + x + ",y:" + y + ",degree:" + degree); 
    return degree; 
  } 
 
  // 獲取距離圓心的距離 
  private float getDistance(float x, float y) { 
    // 根據(jù)圓心坐標計算角度 
    float distance = (float) Math 
        .sqrt(((x - mPointX) * (x - mPointX) + (y - mPointY) 
            * (y - mPointY))); 
    return distance; 
  } 
 
  //點擊 
  private boolean SetClick(float x, float y) { 
    float distance = getDistance(x, y); 
    if (mAngle>10||mAngle<-10) { 
      return false; 
    }else if(endTime-beginTime>1000){ 
      return false; 
    } 
    if (distance < bitmapBig.getWidth() / 2) { 
      int mod = 0; 
       
      if (beginAngle < 90 || 330 < beginAngle) { 
        mod = (imageIndex+3-1)%3;               
      } 
      else if (90 < beginAngle && 210 > beginAngle) { 
        mod = (imageIndex+3-2)%3;         
      } 
      else{ 
        mod = imageIndex;         
      } 
      //回調(diào)到主界面進行處理。 
      listener.onModClick(mod); 
    } 
    return true; 
  } 
   
  public interface RotateViewListener {     
    void onModClick(int mode); 
    void onModChange(int mode); 
  } 
}

 Activity中調(diào)用代碼:

package com.example.roatedemo; 
 
import com.example.roatedemo.RotateView.RotateViewListener; 
 
import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.widget.Toast; 
 
public class MainActivity extends Activity implements RotateViewListener{ 
 
  RotateView rotateView; 
  String TAG="MainActivity"; 
  Context mContext; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mContext = this; 
    int height,width; 
    DisplayMetrics displayMetrics = new DisplayMetrics();  
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
    height = displayMetrics.heightPixels; 
    width = displayMetrics.widthPixels; 
    Log.i(TAG, "height:"+height); 
    Log.i(TAG, "width:"+width); 
    rotateView = new RotateView(getApplicationContext(), width/2, height/3, 150,this); 
 
    setContentView(rotateView); 
  } 
  @Override 
  public void onModClick(int mode) { 
    String[] clickStrings = new String[] { "1被點擊", "2被點擊","3被點擊" }; 
    Toast.makeText(mContext, clickStrings[mode], 0).show(); 
     
  } 
  @Override 
  public void onModChange(int mode) { 
    String[] clickStrings = new String[] { "切換到1", "切換到2","切換到3" }; 
    Toast.makeText(mContext, clickStrings[mode], 0).show();  
  } 
 
 
} 

布局文件默認即可。

除了實現(xiàn)圖片旋轉(zhuǎn),還實現(xiàn)將圖片切成3部分,每部分120度,每轉(zhuǎn)動120度切換一個模式,點擊每個部分均有響應(yīng)事件回調(diào)到主界面。涉及保密,圖片不給在此給出。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android中檢測當前是否為主線程最可靠的解決方法

    Android中檢測當前是否為主線程最可靠的解決方法

    這篇文章主要介紹了Android中檢測當前是否為主線程最可靠的解決方法,本文先是給出了最可靠的方法,然后給出了幾個實驗例子,需要的朋友可以參考下
    2015-01-01
  • 違章查詢源碼分享

    違章查詢源碼分享

    本文主要分享了違章查詢源碼,特附上源碼下載地址和測試安裝包下載地址。需要的朋友一起來看下吧
    2016-12-12
  • Android入門教程之Picasso框架

    Android入門教程之Picasso框架

    本文會先介紹Picasso的基本使用方法,讓您快速上手Picasso。后面我們分享實現(xiàn)ListView顯示網(wǎng)絡(luò)圖片的實例,從源碼角度詳細分析它的實現(xiàn),有需要的可以參考借鑒。
    2016-08-08
  • 詳解Android中AsyncTask的使用方法

    詳解Android中AsyncTask的使用方法

    本篇文章主要介紹了Android中AsyncTask的使用方法,有興趣的同學(xué)可以了解一下。
    2016-11-11
  • 詳解Android TableLayout表格布局

    詳解Android TableLayout表格布局

    表格布局的標簽是TableLayout,TableLayout繼承了LinearLayout。所以它依然是一個線性布局,通過本文給大家介紹Android TableLayout表格布局,感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02
  • Android開發(fā)中匿名設(shè)備標識符OAID使用及初始化

    Android開發(fā)中匿名設(shè)備標識符OAID使用及初始化

    這篇文章主要為大家介紹了Android開發(fā)中匿名設(shè)備標識符OAID使用及初始化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Android7.0實現(xiàn)拍照和相冊選取圖片功能

    Android7.0實現(xiàn)拍照和相冊選取圖片功能

    這篇文章主要為大家詳細介紹了Android7.0實現(xiàn)拍照和相冊選取圖片功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 如何在android中制作一個方向輪盤詳解

    如何在android中制作一個方向輪盤詳解

    這篇文章主要給大家介紹了關(guān)于如何在android中制作一個方向輪盤的相關(guān)資料,這個是在手游領(lǐng)域中很常見的用于控制方向的輪盤,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • Android  指紋識別開發(fā)實例

    Android 指紋識別開發(fā)實例

    這篇文章主要介紹了Android6.0 指紋識別開發(fā)實例的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Android 開發(fā)照相功能實例詳解

    Android 開發(fā)照相功能實例詳解

    這篇文章主要介紹了Android 開發(fā)照相功能實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評論