android 放大后如何画圆
我正在使用图像视图并使用layerDrawable 绘制覆盖图像。 我使用了两个位图:original 和 myBitmap。 缩放后,我无法在正确的位置绘制圆圈,它是在不同的位置绘制的。
这是我正在使用的代码,
ImageView view = (ImageView) findViewById(R.id.imageView);
view.setOnTouchListener(this);
Options options = new BitmapFactory.Options();
options.inScaled = false;
original = BitmapFactory.decodeResource(getResources(), R.drawable.mainscreen,options);
original= getResizedBitmap(original, width, 200);
myBitmap = func(original);
Resources r = getResources();
layers = new Drawable[2];
layers[0] = new BitmapDrawable(original);
layers[1] = new BitmapDrawable(myBitmap);
LayerDrawable layerDrawable = new LayerDrawable(layers);
view.setImageDrawable(layerDrawable);
bitmap = Bitmap.createBitmap(width, 200, Config.ARGB_8888);
pcanvas = new Canvas();
pcanvas.setBitmap(bitmap);
pcanvas.drawBitmap(grayScale, 0, 0, null);
public boolean onTouch(View v, MotionEvent rawEvent) {
WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);
// ...
ImageView view = (ImageView) v;
// Dump touch event to log
// dumpEvent(event);
if (isZoomRequired == false)
{
x = (int) rawEvent.getX();
y = (int) rawEvent.getY();
r = SettingsActivity.brushsize;
pcanvas.drawCircle(x, y, r, mPaint);
layers[1] = new BitmapDrawable(bitmap);
LayerDrawable layerDrawable = new LayerDrawable(layers);
view.setImageDrawable(layerDrawable);
}
else
{
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
Log.d(TAG, "mode=DRAG");
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM");
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE");
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
// ...
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x,
event.getY() - start.y);
}
else if (mode == ZOOM) {
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
view.setImageMatrix(matrix);
}
return true; // indicate event was handled
}
请帮助我。缩放后我需要在正确的位置绘制圆圈。
任何帮助将不胜感激。
I am using Image view and drawing overlay image using layerDrawable.
I have used two bitmaps original and myBitmap.
After zoom I am not able draw circle in correct location, it's drawn in different location.
This is the code I am using,
ImageView view = (ImageView) findViewById(R.id.imageView);
view.setOnTouchListener(this);
Options options = new BitmapFactory.Options();
options.inScaled = false;
original = BitmapFactory.decodeResource(getResources(), R.drawable.mainscreen,options);
original= getResizedBitmap(original, width, 200);
myBitmap = func(original);
Resources r = getResources();
layers = new Drawable[2];
layers[0] = new BitmapDrawable(original);
layers[1] = new BitmapDrawable(myBitmap);
LayerDrawable layerDrawable = new LayerDrawable(layers);
view.setImageDrawable(layerDrawable);
bitmap = Bitmap.createBitmap(width, 200, Config.ARGB_8888);
pcanvas = new Canvas();
pcanvas.setBitmap(bitmap);
pcanvas.drawBitmap(grayScale, 0, 0, null);
public boolean onTouch(View v, MotionEvent rawEvent) {
WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);
// ...
ImageView view = (ImageView) v;
// Dump touch event to log
// dumpEvent(event);
if (isZoomRequired == false)
{
x = (int) rawEvent.getX();
y = (int) rawEvent.getY();
r = SettingsActivity.brushsize;
pcanvas.drawCircle(x, y, r, mPaint);
layers[1] = new BitmapDrawable(bitmap);
LayerDrawable layerDrawable = new LayerDrawable(layers);
view.setImageDrawable(layerDrawable);
}
else
{
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
Log.d(TAG, "mode=DRAG");
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM");
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE");
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
// ...
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x,
event.getY() - start.y);
}
else if (mode == ZOOM) {
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
view.setImageMatrix(matrix);
}
return true; // indicate event was handled
}
Kindly help me. I need to draw circle in correct location after zoom.
Any help would be appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您能否添加显示您想要获得的内容的图像以及显示您获得的内容的图片?
需要记住的一件事是,某些操作对 y 轴使用不同的零点。我一直在与表面视图上的矩阵运算作斗争,其中我必须计算校正因子,因为一个操作将视图的顶部用作 y=0,而矩阵运算将视图的底部用作 y=0 ,因此实际的矩阵运算需要类似:matrixY = (totalHeightY - Yposition)。
但是,显示您的期望和您得到的结果将有助于比运行和处理代码更快地诊断问题:)
Could you add images showing what it is you're trying to get and a pic showing what you get instead?
One thing to keep in mind is that certain operations use a different zero point for the y axis. I've been fighting this on matrix operations on a surfaceview, where I've had to calculate a correction factor because one operation used the top of the view as y=0 and the matrix operation used the bottom of the view as y=0, so the actual matrix operation needed something like: matrixY = (totalHeightY - Yposition).
But showing what you expect and what you're getting would help diagnose the problem quicker than running and working through your code :)
我可以看到在使用 postTranslate 之前尚未使用 matrix.preTranslate 以确保视图将图像设置在正确的位置。
I could see the matrix.preTranslate has not been used before you use postTranslate to make sure that view sets the image in correct place.
如果不知道您要做什么,就很难正确回答。
我建议您创建另一个扩展 View 的类,并使用它在 Activity 中的 ImageView 顶部绘制圆圈。这还允许您绘制尽可能多的圆圈(如果您计划绘制多个圆圈),而无需在活动中创建某些函数。
创建扩展 View 的类后,在 onDraw() 方法上,您可以通过 canvas.drawCircle() 和 canvas.translate() 绘制圆圈,以在屏幕上移动它。您必须使用 onTouchEvent 并为此拦截触摸事件。
这里有一个很好的例子,其中包含 apk: http://adblogcat.com/custom-view-to-draw-rotate-erase-and-convert-images-to-black-and-white/
This is hard to answer correctly without knowing what you are trying to do.
I suggest that you create another class that extends View and use this to draw the circle on top of your ImageView in your activity. This also would allow you to draw as many circles (if you are planning on more than 1) without having to create some function inside your Activity.
Once you create your class that extends View, then on your onDraw() method you can draw the circle by canvas.drawCircle() and canvas.translate() to move it around the screen. You will have to use onTouchEvent and intercept the touch events for this.
There is a good example here with apk included: http://adblogcat.com/custom-view-to-draw-rotate-erase-and-convert-images-to-black-and-white/
如下OnTouchListener,您可以缩放图像或位图。当您的缩放级别存档后,
现在开始在图像的缩放部分上绘制圆圈,这里我编写简单绘制的代码。您可以将绘制圆圈的代码放在下面的侦听器中。希望这对你有用。
PaintView.class
}
As below OnTouchListener you can zoom your image or bitmap.when your zoom level is archived then
Now start to draw circle on zoom portion of image,here i write code for simple paint.You can put your code for draw circle in below listener.Hope this is useful for you.
PaintView.class
}