使用SeekBar(Android)的ImageView水平裁剪

时间:2016-07-31 21:44:21

标签: android android-imageview android-bitmap

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

Crop controlled by a Seekbar

这是我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

Progress value is 100

进展值:50

Progress value is 50

进展值:25

Progress value is 25

正如您所看到的,这不是理想的行为......

我的问题是两个:

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

3 个答案:

答案 0 :(得分:0)

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

2-我的新位图是否正确定义? 我认为Lumis应该帮助你的芒果here

答案 1 :(得分:0)

最简单的方法是不制作新的位图 - 实际上这是最糟糕的做法。最简单的方法是通过布局参数

来改变图像视图的宽度

答案 2 :(得分:0)

我希望这会有所帮助:

package Net::FTP::File;

use strict;
use warnings;
use Net::FTP;

# ...

sub Net::FTP::pretty_dir {
    shift;
    my $newp = shift;
    if ( defined $newp ) {
        $pretty = $newp;
        $DirProcHash{cols} = $cols{pretty}  if $pretty;
        $DirProcHash{cols} = $cols{utility} if !$pretty;
    }
    return $pretty;
}

# ...

sub Net::FTP::isfile {
    my $ftp = shift;
    return 1 if $ftp->exists(@_) && !$ftp->isdir(@_);
    0;
}

像这样使用:

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