在图像中围绕图像放置一些指示器移动/调整大小/旋转操作

Vik*_*tel 29 android image-editing android-image

我想缩放,移动,调整图像大小.我想用指示器环绕图像,指示用户这些指示器执行的操作,即移动,旋转,缩放.

在此输入图像描述

我试过了

  • 缩放 - 但它只会减少.没有机会增加图像的长度和高度.
  • 旋转 - 通过插入手动度数实现.这不是一个好选择.
  • 移动 - 因为我实现了对Api <11的拖累.所以有点困难.在这里仍然没有希望.

有没有可以对我进行简单图像编辑的库[移动,缩放,旋转]?

Pra*_*ani 6

您可以使用Matrix变换来实现旋转,缩放和移动....我希望这会对您有所帮助....

用于旋转

Matrix matrix = new Matrix();
    matrix.postRotate(90);
Run Code Online (Sandbox Code Playgroud)

用于缩放

 matrix.postScale(scaleWidth, scaleHeight);
Run Code Online (Sandbox Code Playgroud)

创建新的位图而不更改原始位图...像这样

Bitmap bmp2 = Bitmap.createBitmap(bmp1, 0, 0, pow2, pow2, matrix, true);
Run Code Online (Sandbox Code Playgroud)


Vik*_*tel 4

使用库:StickerView

它是一个第三方库,它提供了我正在寻找的东西。

解决方法:

这些答案仍然是我在OP中要求的一半。意味着它没有被某些特定指标包围。我仍在寻找如何使用ImageView指示器换行并将其用于翻译和调整大小。

内部变量的初始化Activity对于翻译和调整大小很重要ImageView

public static final int DRAG = 1;
public static final int NONE = 0;
private static final String TAG = "Touch";
public static final int ZOOM = 2;
public static PointF mid = new PointF();
public static int mode = 0;
float d = 0.0F;
Matrix savedMatrix = new Matrix();
Matrix matrix = new Matrix();
PointF start = new PointF();
Run Code Online (Sandbox Code Playgroud)

设置ImageView为scaleType -Matrix

iv = new ImageView(this);
iv.setPadding(10, 10, 25, 25);
iv.setScaleType(ImageView.ScaleType.MATRIX);

iv.setOnTouchListener(t);
Run Code Online (Sandbox Code Playgroud)

添加 onTouch 监听器来ImageView使用

  • 1 指用于翻译 - 拖动
  • 2 指缩放 - 调整大小{捏合缩放}

    View.OnTouchListener t = new View.OnTouchListener()
    {
    public boolean onTouch(View paramView, MotionEvent event)
    {
      ImageView view = (ImageView)paramView;
      switch (event.getAction() & MotionEvent.ACTION_MASK)
      {
      case MotionEvent.ACTION_DOWN:
    
          savedMatrix.set(matrix);
          start.set(event.getX(), event.getY());
          Log.d(TAG, "mode=DRAG" );
          mode = DRAG;
          break;
      case MotionEvent.ACTION_POINTER_DOWN:
    
          oldDist = spacing(event);
          Log.d(TAG, "oldDist=" + oldDist);
          if (oldDist > 10f) {
    
              savedMatrix.set(matrix);
              midPoint(mid, event);
              mode = ZOOM;
              Log.d(TAG, "mode=ZOOM" );
          }
          break;
    
      case MotionEvent.ACTION_MOVE:
    
          if (mode == DRAG) {
    
              matrix.set(savedMatrix);
              matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
          }
          else if (mode == ZOOM) {
    
              float newDist = spacing(event);
              Log.d(TAG, "newDist=" + newDist);
              if (newDist > 10f) {
    
                  matrix.set(savedMatrix);
                  float scale = newDist / oldDist;
                  matrix.postScale(scale, scale, mid.x, mid.y);
              }
          }
          break;
    
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_POINTER_UP:
    
          mode = NONE;
          Log.d(TAG, "mode=NONE" );
          break;
      }  
      view.setImageMatrix(matrix);
      return true;
    
    }
    
     private void midPoint(PointF point, MotionEvent event) {
    
        float x = event.getX(0) + event.getX(1);
        float y = event.getY(0) + event.getY(1);
        point.set(x / 2, y / 2);
    }
    
          private float spacing(MotionEvent event) {
          float x = event.getX(0) - event.getX(1);
          float y = event.getY(0) - event.getY(1);
          return FloatMath.sqrt(x * x + y * y);
          }
         };
    
    Run Code Online (Sandbox Code Playgroud)