大于屏幕分辨率的ImageView重新缩放错误

时间:2017-04-05 18:29:59

标签: android image imageview android-imageview relativelayout

我正在尝试构建绘图工具,此绘图工具允许用户选择图像并将其放置在草图中,然后可以在其中对其进行操作。 属于项目的所有图像都设置为相同的比例(1:100):程序创建工作区所遵循的步骤如下:首先弹出一个对话框,要求用户在X轴上输入工作区:

//prompts user for area size
String areaX = txtLargeArea.getText().toString();

//parse to int 
int area = Integer.parseInt(areaX);
if (area > 14 && area < 101) {

   //set atributes from MyConvert Class 
   // 15 is a fixed size for Y axis
   MyConvert.setAreaSelected(new PointF(area, 15));                                              
   MyConvert.setScale(MyConvert.setSizeWorkAre());

使用setSizeWorkAre返回的函数设置Scale:

public static float setSizeWorkAre() {
   PointF offsetMtrs = PixsToMts(offset);//65x100 are default value to set the offset point for the plot
   scale = 1;
   PointF screenInMts = PixsToMts(screenResolution);
   return ((areaSelected.x + offsetMtrs.x) / screenInMts.x);

此方法将像素转换为Meters:

public static PointF PixsToMts(PointF coordenate) {  
return new PointF((float) ((((coordenate.x * 2.54) / dpi) * scale) / 100), 
(float) ((((coordenate.y * 2.54) / dpi) * scale) / 100));
}

然后我得到了屏幕分辨率:

// class that allows to obtain info about device
DisplayMetrics metrics = getResources().getDisplayMetrics();                                
//set atributes from MyConvert class
MyConvert.setDpi(metrics.densityDpi);  
MyConvert.setScreenResolution(new 
PointF(metrics.widthPixels,metrics.heightPixels));

现在我设置了屏幕工作区,我继续放置图像:

ImageView newImage = new ImageView(getContext());
//set properties for imageView                                                   
newImage.setScaleType(ImageView.ScaleType.CENTER);                                          
newImage.setAdjustViewBounds(true);
newImage.setDrawingCacheEnabled(true);
newImage.setOnTouchListener(this); 

这是图像重新缩放的地方

imgViewSelected.getLayoutParams().width = (int) 
MyConvert.scaleValue(newImage.getDrawable().getIntrinsicWidth());

imgViewSelected.getLayoutParams().height = (int) 
MyConvert.scaleValue(newImage.getDrawable().getIntrinsicHeight());

和scaleValue方法:

public static float scaleValue(float value){
float resScale= getScale()/122;

float salida=    value/resScale;
     return salida; 
}

这一切都很顺利,直到我选择一个尺寸大于屏幕分辨率的图像,就像是自动重新缩放,然后根据我的指示进行另一次重新缩放。

一些图片可以了解正在发生的事情:

在此图像中,它似乎正常工作,当工作区域设置为40或更多(mts)时,它看起来更好,值越大,接近越好

在这种情况下,区域设置为30(mts),您可以看到它如何将图像重新缩放到更小的位置,请记住它只发生在大于屏幕分辨率的图像上

那里有图像处理专家吗?任何有关此事的提示都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

使用包装图像的框架布局。

示例:

<FrameLayout
            android:id="@+id/yourid"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

      <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent">
      </ImageView>


</FrameLayout>

FrameLayout或Scroll View不受屏幕尺寸的限制,因此您的图片不会被Android重新缩放。