我需要在我的应用中添加以下功能
我必须将Bitmap显示到Canvas
然后用户可以放大并缩小位图到Canvas
如何使它成为可能? 我只需要Canvas而不是ImageView
所有答案对我都没有多大帮助..所以我想更新我的问题
基本上我需要一个简单的2按钮和画布......
在第一个按钮上单击画布上的图像可以旋转/放大和缩小,单击第二个按钮时,它必须显示由用户创建的缩放或缩小图像,之后用户必须无法缩放或缩小画布
答案 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;
}