【问题标题】:Horizontal crop of ImageView using a SeekBar (Android)使用 SeekBar (Android) 水平裁剪 ImageView
【发布时间】:2016-08-01 07:24:26
【问题描述】:

我想使用SeekBar 控制ImageView 的水平裁剪,如下图所示:

这是我的progressChanged 事件代码:

    cropSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            float tuning = (float) progress/seekBar.getMax();

            if (tuning == 0) {
                return;
            }

            int width = (int)(tuning * originalPhotoBitmap.getWidth());
            int height = originalPhotoBitmap.getHeight();

            modifiedPhotoBitmap = Bitmap.createBitmap(originalPhotoBitmap, 0, 0, width, height);

            imageView.setImageBitmap(modifiedPhotoBitmap);
        }
    });

新宽度计算正确(我检查了 logcat 中的值),但是当我使用 setImageBitmap 设置 imageView 的位图时,ScaleType FIT_CENTER 似乎不再工作了......

我的代码实际上是这样的:

进度值:100

进度值:50

进度值:25

如您所见,这不是我们想要的行为......

我的问题有两个:

  1. 我应该在 ImageView 中使用什么比例类型?
  2. 我的新位图定义正确吗?

【问题讨论】:

    标签: android android-imageview android-bitmap


    【解决方案1】:

    1- 我应该在 ImageView 中使用什么比例类型? 如果我理解正确,不舒尔,但如果你想集中设置 ImageView,你应该使用 Gravity 属性。

    2- 我的新位图定义正确吗? 我相信 Lumis 的 awnser here 应该可以帮助你

    【讨论】:

      【解决方案2】:

      最简单的方法不是制作新的位图——事实上这是最糟糕的方法。最简单的方法是通过其布局参数更改图像视图的宽度

      【讨论】:

      • 所以 imageView 的宽度不会改变它的内容宽度(实际照片)?那么,imageView 的宽度就是容器的宽度?
      【解决方案3】:

      我希望这会有所帮助:

      Bitmap getCroppedBitmap(Bitmap bitmap, int progress) {
          Bitmap output = Bitmap.createBitmap(
                  bitmap.getWidth(),
                  bitmap.getHeight(),
                  Bitmap.Config.ARGB_8888);
      
          Canvas canvas = new Canvas(output);
      
          Paint paint = new Paint();
          canvas.drawRect(0, 0, bitmap.getWidth() * progress / 100, bitmap.getHeight(), paint);
          paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
      
          Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
          canvas.drawBitmap(bitmap, rect, rect, paint);
      
          return output;
      }
      

      这样使用:

      int progress = 70;
      imageView.setImageBitmap(getCroppedBitmap(originalPhotoBitmap, progress));
      

      【讨论】:

      • 我将 ImageView 保留在 FIT_CENTER 中?
      • 哦.. 我将示例发布到 github github.com/nshmura/TestCrop 。如果这在您的环境中不起作用,您能告诉我您的环境(Android 操作系统版本和您的设备)吗?
      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2015-08-15
      相关资源
      最近更新 更多