最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

在View中進(jìn)行重繪,主要是通過計(jì)算角度及距離來實(shí)現(xiàn)。實(shí)現(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;//中間不動(dòng)的圖片 
  private Bitmap bitmapBig;//隨手指轉(zhuǎn)動(dòng)的圖片 
  private Bitmap bitmapOut;//外圍不動(dòng)的圖片 
  // 圓心坐標(biāo) 
  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; 
      //如果點(diǎn)擊觸摸范圍在圈外,則不處理 
      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); 
  } 
 
  // 子控件位置改變重新計(jì)算角度 
  private int computeCurrentAngle(float x, float y) { 
    // 根據(jù)圓心坐標(biāo)計(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ù)圓心坐標(biāo)計(jì)算角度 
    float distance = (float) Math 
        .sqrt(((x - mPointX) * (x - mPointX) + (y - mPointY) 
            * (y - mPointY))); 
    return distance; 
  } 
 
  //點(diǎn)擊 
  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)到主界面進(jìn)行處理。 
      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被點(diǎn)擊", "2被點(diǎn)擊","3被點(diǎn)擊" }; 
    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();  
  } 
 
 
} 

布局文件默認(rèn)即可。

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

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

相關(guān)文章

  • Android組件TabHost實(shí)現(xiàn)頁面中多個(gè)選項(xiàng)卡切換效果

    Android組件TabHost實(shí)現(xiàn)頁面中多個(gè)選項(xiàng)卡切換效果

    這篇文章主要為大家詳細(xì)介紹了Android組件TabHost實(shí)現(xiàn)頁面中多個(gè)選項(xiàng)卡切換效果的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android事件分發(fā)的事件由來原理分析

    Android事件分發(fā)的事件由來原理分析

    這篇文章主要為大家介紹了Android事件分發(fā)的事件由來原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Android自定義view仿淘寶快遞物流信息時(shí)間軸

    Android自定義view仿淘寶快遞物流信息時(shí)間軸

    這篇文章主要為大家詳細(xì)介紹了Android自定義view仿淘寶快遞物流信息時(shí)間軸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Notification與NotificationManager詳細(xì)介紹

    Notification與NotificationManager詳細(xì)介紹

    在Android系統(tǒng)中,發(fā)一個(gè)狀態(tài)欄通知還是很方便的。下面我們就來看一下,怎么發(fā)送狀態(tài)欄通知,狀態(tài)欄通知又有哪些參數(shù)可以設(shè)置
    2012-11-11
  • Android程序開發(fā)仿新版QQ鎖屏下彈窗功能

    Android程序開發(fā)仿新版QQ鎖屏下彈窗功能

    最近做了一個(gè)項(xiàng)目,其中涉及到這樣一個(gè)功能:新版的qq能在鎖屏下彈窗顯示qq消息,下面小編抽時(shí)間把實(shí)現(xiàn)代碼分享給大家感興趣的朋友參考下吧
    2016-09-09
  • kotlin中的行為組件及高級(jí)用法

    kotlin中的行為組件及高級(jí)用法

    Jetpack中的四大行為組件:WorkManager、DataBinding、Coroutines和Lifecycle,分別解決了后臺(tái)任務(wù)調(diào)度、數(shù)據(jù)驅(qū)動(dòng)UI、異步編程和資源管理等問題,通過實(shí)戰(zhàn)代碼展示了它們的具體用法和最佳實(shí)踐,本文介紹kotlin中的行為組件,感興趣的朋友一起看看吧
    2025-03-03
  • 簡單實(shí)現(xiàn)Android端搜索框示例詳解

    簡單實(shí)現(xiàn)Android端搜索框示例詳解

    這篇文章主要為大家介紹了簡單實(shí)現(xiàn)Android端搜索框示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android實(shí)例HandlerThread源碼分析

    Android實(shí)例HandlerThread源碼分析

    本篇文章主要給大家通過實(shí)例代碼分析了Android中HandlerThread的用法以及步驟,需要的朋友參考學(xué)習(xí)下吧。
    2017-12-12
  • Android編程獲取網(wǎng)絡(luò)時(shí)間實(shí)例分析

    Android編程獲取網(wǎng)絡(luò)時(shí)間實(shí)例分析

    這篇文章主要介紹了Android編程獲取網(wǎng)絡(luò)時(shí)間,結(jié)合實(shí)例形式對(duì)比分析了Android通過訪問網(wǎng)絡(luò)及通過GPS獲取網(wǎng)絡(luò)時(shí)間的具體步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-01-01
  • Android三種常見的圖片壓縮方式

    Android三種常見的圖片壓縮方式

    在開發(fā)中,我們經(jīng)常有這樣一種需求,從相冊選擇圖片,上傳到服務(wù)器。隨著手機(jī)像素的不斷提升,照片也是小一點(diǎn)的3,4兆,大一點(diǎn)的多大10多兆。如果直接上傳原圖,會(huì)增大服務(wù)器壓力,所以,在上傳之前對(duì)圖片壓縮就顯得很必要了。
    2021-05-05

最新評(píng)論

瑞丽市| 平果县| 会理县| 合山市| 新巴尔虎左旗| 通州市| 大姚县| 西城区| 建湖县| 衡阳市| 湄潭县| 武威市| 边坝县| 康马县| 鄂伦春自治旗| 泽州县| 六安市| 改则县| 南川市| 仙桃市| 台山市| 盐城市| 大厂| 贵港市| 毕节市| 武汉市| 盐山县| 普格县| 洪泽县| 迭部县| 山东省| 额敏县| 洪湖市| 仪征市| 吉首市| 股票| 公安县| 新河县| 玉山县| 宁夏| 马公市|