在android中的缩放图像上定义可触摸区域

时间:2012-01-15 15:12:14

标签: android graphics android-imageview

之前我已经提出了与此相关的问题,但我认为我的目标是错误的。

我拥有:自定义ImageView,它显示图形并将多个可触摸区域定义为图像中的矩形。我的问题是缩放。我想根据位图文件中的实际分辨率来定义图像的可触摸区域,但是转换这些坐标使得矩形覆盖缩放图像上的相同区域。

这是我到目前为止所得到的: 创建视图时,计算实际尺寸与缩放尺寸的比率

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
Drawable pic=this.getDrawable();
int realHeight= pic.getIntrinsicHeight();   
int realWidth=pic.getIntrinsicWidth();
int scaledHeight=this.getHeight();
int scaleWidth=this.getWidth();
heightRatio=(float)realHeight/scaledHeight;
widthRatio=(float)realWidth/scaleWidth;
}

现在我想在原始(未缩放)图像上采用定义矩形的坐标 并将该矩形绘制到图像的同一区域 - 但考虑到比例:

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p=new Paint();
p.setStrokeWidth(1);
p.setColor(Color.BLUE);
for (HotSpot h: spots)
{
//Each hotspot has a rectangle defined in reference to the actual size of the image
Rect old=h.getRect();
float offsetLeft=old.left+(old.left*widthRatio);
float offsetTop=old.top+(old.top*heightRatio);
float offsetRight=old.right+(old.right*heightRatio);
float offsetBottom=old.bottom+(old.bottom*widthRatio);
RectF nRect=new RectF(offsetLeft,offsetTop,offsetRight,offsetBottom);
canvas.drawRect(nRect,p);

 } 

结果是“在球场”但不太准确。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您可以尝试此解决方案:

  • 获取屏幕密度
  • 获取图像高度(或宽度)
  • 将高度(或宽度)除以密度,因此得到以英寸为单位的长度
  • 将坐标除以长度(以英寸为单位),以便获得坐标与图像之间的关系,该关系与图像有效尺寸无关。
  • 当您必须在不同比例的图像上绘制相同的点时,将最后一个结果乘以第二个图像(使用上面列出的相同操作获得的)获得的长度(英寸)

实施例: 在第一张图片上:

float density = getResources().getDisplayMetrics().density;
int width = getWidth();
float inchesLength = width/density;
float scaledXCenter = xCenter / inchesLength;

在具有不同比例的相同图像上:

float density = getResources().getDisplayMetrics().density;
int width = getWidth();
float inchesLength = width/density;
float restoredXCenter = scaledXCenter * inchesLength;