【问题标题】:ImageView rotate without recreating the bitmapImageView 旋转而不重新创建位图
【发布时间】:2013-03-29 11:45:01
【问题描述】:

我想旋转 ImageView 图像。这是我的代码:

Matrix mat = new Matrix();
mat.preRotate(90, ivImage.getWidth()/2, ivImage.getHeight()/2);
ivImage.setScaleType(ScaleType.MATRIX);
ivImage.setImageMatrix(mat);

但是当我点击旋转按钮时,不仅图像旋转,而且它也被缩放,因为位图比ImageView大。

我知道我可以使用

b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), mat, true);
ivImage.setImageBitmap(b);

但这明显较慢,并且有一些滞后。

所以我的问题是:如何在不缩放且不重新创建位图的情况下旋转图像?

【问题讨论】:

    标签: java android matrix bitmap android-imageview


    【解决方案1】:

    这是我用于将图像旋转到 90 度的代码。

             if(oldAngle == 0){
                  newAngle = oldAngle + 90;
                }
                else if(oldAngle == 90)
                    newAngle = oldAngle - 90;
                  LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();
                  int centerX = layoutParams.leftMargin + (view.getWidth()/2);
                  int centerY = layoutParams.topMargin + (view.getHeight()/2);
                  RotateAnimation animation = new RotateAnimation(oldAngle, newAngle, centerX, centerY);
                  animation.setDuration(0);
                  animation.setRepeatCount(2);
                  animation.setFillAfter(true);
                  view.startAnimation(animation);
    
                  oldAngle = newAngle;
    

    希望对你有帮助...

    【讨论】:

    • 这很好,但是当图像旋转到 90 度时图像被剪切,整个图像不可见,它超出了图像视图的范围。有什么解决办法吗?
    • @nikmin 你能附上那张图片的屏幕截图吗
    • 我认为当视图旋转时您的线性布局宽度或高度不可调整。
    • 是的,它不可调整,因为当我以横向加载图像时,它会占用所有可用空间。当我旋转它时,它会超出范围,因为旋转后宽度变成了高度。但没关系,我找到了另一种包括旋转和裁剪的解决方案。我正在使用this
    【解决方案2】:

    使用 XML 动画怎么样?

    <?xml version="1.0" encoding="utf-8"?>
        <rotate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromDegrees="0"
        android:interpolator="@android:anim/linear_interpolator"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="1000"
        android:startOffset="0"
        android:repeatCount="infinite"
        />
    

    然后将它与类似的东西一起使用;

     rotation = AnimationUtils.loadAnimation(this, R.anim.clockwise_rotation);
     buttonRefresh.startAnimation(rotation);
    

    ps。这无限旋转。所以需要一些调整。

    【讨论】:

      【解决方案3】:

      使用这个

      final Random generator = new Random();
              int n = 10000;
              n = generator.nextInt(n);
              final Matrix mtx = new Matrix();
              mtx.postRotate(n);
              rotator = Bitmap.createBitmap(all, 0, 0,
                      all.getWidth(), all.getHeight(), mtx,
                      true);
              view.setImageBitmap(rotator);
      

      这将随机旋转图像。只需将.nextInt(n) 更改为.nextInt(AnyNumberYouLife) 它很快:)

      【讨论】:

        【解决方案4】:

        我发现就我的目的而言,使用Canvas 而不是ImageView 是最好的解决方案。对于图像的旋转,我选择使用另一个可以找到的库here

        【讨论】:

          【解决方案5】:

          这是为 imageView 放置旋转可绘制对象的一个​​很好的解决方案:

          Drawable getRotateDrawable(final Bitmap b, final float angle) {
              final BitmapDrawable drawable = new BitmapDrawable(getResources(), b) {
                  @Override
                  public void draw(final Canvas canvas) {
                      canvas.save();
                      canvas.rotate(angle, b.getWidth() / 2, b.getHeight() / 2);
                      super.draw(canvas);
                      canvas.restore();
                  }
              };
              return drawable;
          }
          

          用法:

          Bitmap b=...
          float angle=...
          final Drawable rotatedDrawable = getRotateDrawable(b,angle);
          root.setImageDrawable(rotatedDrawable);
          

          另一种选择:

          private Drawable getRotateDrawable(final Drawable d, final float angle) {
              final Drawable[] arD = { d };
              return new LayerDrawable(arD) {
                  @Override
                  public void draw(final Canvas canvas) {
                      canvas.save();
                      canvas.rotate(angle, d.getBounds().width() / 2, d.getBounds().height() / 2);
                      super.draw(canvas);
                      canvas.restore();
                  }
              };
          }
          

          另外,如果你想旋转位图,但又怕 OOM,你可以使用我制作的 NDK 解决方案here

          【讨论】:

            【解决方案6】:

            我发现旋转 ImageView 的最简单方法是这样做:

            view.animate().rotationBy(degrees);
            

            非常容易实现,其余的都由 android 处理

            希望这会有所帮助! :)

            【讨论】:

              猜你喜欢
              • 2016-05-24
              • 1970-01-01
              • 1970-01-01
              • 2012-09-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-08
              相关资源
              最近更新 更多