Android规模在画布上缩放缩放位图

时间:2014-09-10 04:54:38

标签: android canvas bitmap zoom

我需要在我的应用中添加以下功能

我必须将Bitmap显示到Canvas

然后用户可以放大并缩小位图到Canvas

如何使它成为可能? 我只需要Canvas而不是ImageView

所有答案对我都没有多大帮助..所以我想更新我的问题

基本上我需要一个简单的2按钮和画布......

在第一个按钮上单击画布上的图像可以旋转/放大和缩小,单击第二个按钮时,它必须显示由用户创建的缩放或缩小图像,之后用户必须无法缩放或缩小画布

3 个答案:

答案 0 :(得分:7)

如果放大并缩小画布中的位图,请使用以下代码

在您的活动中添加您的代码

MyView myView = new MyView(this);
    setContentView(myView);

在您的视野之下。

public class MyView extends View {
private Drawable image;
private ScaleGestureDetector scaleDetector;
private float scaleFactor = 1.f;

public MyView(Context context) {
    super(context);
    init(context);
}

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public MyView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

private void init(Context ctx) {
    image = getResources().getDrawable(R.drawable.ic_launcher);
    image.setBounds(0, 0, image.getIntrinsicWidth(),
            image.getIntrinsicHeight());
    scaleDetector = new ScaleGestureDetector(ctx, new ScaleListener());
}


@Override
protected void onDraw(Canvas canvas) {
    canvas.save();
    canvas.scale(scaleFactor, scaleFactor);
    image.draw(canvas);
    canvas.restore();

};

@Override
public boolean onTouchEvent(MotionEvent ev) {
    scaleDetector.onTouchEvent(ev);
    return true;
}

private class ScaleListener extends
        ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        scaleFactor *= detector.getScaleFactor();
        scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 10.0f));
        invalidate();
        return true;
    }
}
}

答案 1 :(得分:2)

您可以使用此自定义视图类,它提供拖动以及缩放效果。 我不是这个类的原作者,我从这个tutorial复制了它。如果您希望逐步了解如何实现此效果,则可以浏览tutorial pages

  library(dplyr)
  mtcars %>% arrange(gear) %>%
  mutate(gearW = ifelse(gear == 3, "Three", ifelse(gear == 4, "Four", "Five")))

答案 2 :(得分:0)

您可以检查条件if (scaleFactor == 1.f),然后将所有变量设置为默认值,并在方法postInvalidate()中调用onTouchEvent

例如:

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        scaleDetector.onTouchEvent(ev);
          if (scaleFactor <= 1.f){
              //set all variables of zooming and scrolling to default
              scaleFactor = 1.f;
              postinvalidate();
          }
        return true;
    }