Android实现图片随手指旋转功能

本文实例为大家分享了Android实现图片随手指旋转功能的具体代码,供大家参考,具体内容如下

在View中进行重绘,主要是通过计算角度及距离来实现。实现类代码如下:

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;//随手指转动的图片
  private Bitmap bitmapOut;//外围不动的图片
  // 圆心坐标
  private float mPointX = 0, mPointY = 0; 

  private int flag = 0;
  // 半径
  private int mRadius = 0;
  // 旋转角度
  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) {
    // 根据圆心坐标计算角度
    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) {
    // 根据圆心坐标计算角度
    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;
      }
      //回调到主界面进行处理。
      listener.onModClick(mod);
    }
    return true;
  } 

  public interface RotateViewListener {
    void onModClick(int mode);
    void onModChange(int mode);
  }
}

Activity中调用代码:

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();
  } 

} 

布局文件默认即可。

除了实现图片旋转,还实现将图片切成3部分,每部分120度,每转动120度切换一个模式,点击每个部分均有响应事件回调到主界面。涉及保密,图片不给在此给出。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 图片缩放与旋转的实现详解

    本文使用Matrix实现Android实现图片缩放与旋转.示例代码如下: 复制代码 代码如下: package com.android.matrix;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.graphics.drawable.BitmapDrawable

  • Android Tween动画之RotateAnimation实现图片不停旋转效果实例介绍

    主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果:第二类是 Frame 动画,即顺序播放事先做好的图像,跟电影类似.本文分析 Tween动画的rotate实现旋转效果. 在新浪微博客户端中各个操作进行中时activity的右上角都会有个不停旋转的图标,类似刷新的效果,给用户以操作中的提示.这种非模态的提示方式推荐使用,那么下面就分享下如何实现这种效果

  • android图片处理之让图片一直匀速旋转

    本文是在我的文章android图片处理,让图片变成圆形 的基础上继续写的,可以去看看,直接看也没关系,也能看懂 1.首先在res文件夹下创建一个名字为anim的文件夹,名字不要写错  2.在anim里面创建一个xlm文件:img_animation.xml,这个名字随便写都可以,注意不要大写,里面的代码如下: <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http:/

  • 解决android有的手机拍照后上传图片被旋转的问题

    需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器 遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重. 解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去

  • 基于Android 实现图片平移、缩放、旋转同时进行

    前言 之前因为项目需求,其中使用到了图片的单击显示取消,图片平移缩放功能,昨天突然想再加上图片的旋转功能,在网上看了很多相关的例子,可是没看到能同时实现我想要的功能的. 需求: (1)图片平移.缩放.旋转等一系列操作后,图片需要自动居中显示. (2)图片旋转后选自动水平显示或者垂直显示 (3)图片在放大缩小的同时都能旋转 Demo实现部分效果截图 Demo主要代码 Java MainActivity.java package com.practice.noyet.rotatezoomimagev

  • Android UI之ImageView实现图片旋转和缩放

    这一篇,给大家介绍一下ImageView控件的使用,ImageView主要是用来显示图片,可以对图片进行放大.缩小.旋转的功能. android:sacleType属性指定ImageVIew控件显示图片的方式,例如:center表示图像以不缩放的方式显示在ImageView控件的中心,如果设置为fitCenter,表示图像按照比例缩放至合适的位置,并在ImageView控件的中心. 首先我们开发一个简单的案例,实现图片的放大缩小和旋转: 先看看实现的效果: 缩放截图1: 缩放截图2: 旋转截图1

  • Android实现图片反转、翻转、旋转、放大和缩小

    ********************************************************************** android 实现图片的翻转 ********************************************************************** Resources res = this.getContext().getResources(); img = BitmapFactory.decodeResource(res, R.

  • Android中利用matrix 控制图片的旋转、缩放、移动

    本文主要讲解利用android中Matrix控制图形的旋转缩放移动,具体参见一下代码: 复制代码 代码如下: /**  * 使用矩阵控制图片移动.缩放.旋转  */  public class CommonImgEffectView extends View { private Context context ;      private Bitmap mainBmp , controlBmp ;      private int mainBmpWidth , mainBmpHeight , c

  • Android单点触控实现图片平移、缩放、旋转功能

    相信大家使用多点对图片进行缩放,平移的操作很熟悉了,大部分大图的浏览都具有此功能,有些app还可以对图片进行旋转操作,QQ的大图浏览就可以对图片进行旋转操作,大家都知道对图片进行缩放,平移,旋转等操作可以使用Matrix来实现,Matrix就是一个3X3的矩阵,对图片的处理可分为四个基础变换操作,Translate(平移变换).Rotate(旋转变换).Scale (缩放变换).Skew(错切变换),如果大家对Matrix不太了解的话可以看看这篇文章(点击查看),作者对每一种Matrix的变换写

  • Android部分手机拍照后获取的图片被旋转问题的解决方法

    调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的.其它品牌的手机都是正常的,就三星出现这个怪事. 在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊! 解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了. 具体思路: 1.首先在调用拍照方法时,保存拍照后的相片原图,得到原图路径,(PhotoBitmapUtils是我自己写的一个

随机推荐