Android:如何创建具有缩放平移和缩放功能的画布?

时间:2018-03-01 18:34:24

标签: java android canvas imageview

我一直在这个位置按照教程创建一个Android图片视图,允许用户平移图像和缩放缩放:

http://www.northborder-software.com/pinchzoom_and_pan_5.html

它要求用户手机上的图像使用,但我修改了它以使用我在可绘制文件夹中提供的特定图像:

public class MainActivity extends AppCompatActivity {

private static final int MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE = 101;
private static final int RESULT_LOAD_IMAGE = 1;
private Button getImage;
protected PinchZoomPan pinchZoomPan;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    pinchZoomPan = (PinchZoomPan) findViewById(R.id.ivImage);

    askForRuntimePermission();




    Uri selectedImage = Uri.parse("android.resource://com.nbstutorials.pinchzoompan/drawable/map2");
    pinchZoomPan.loadImageOnCanvas(selectedImage);



}

private void askForRuntimePermission() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {
        case MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //permission is granted do nothing in this case
            } else {
                //permission denied
                Toast.makeText(getApplicationContext(), "this app requires permission to read external storage", Toast.LENGTH_SHORT).show();
                finish();
            }

    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        Uri selectedImage = Uri.parse("android.resource://com.nbstutorials.pinchzoompan/drawable/map2");


        pinchZoomPan.loadImageOnCanvas(selectedImage);


}
}

这很有效,但是当我尝试在 PinchZoomPan.java 方法onDraw中绘制一条线时,它并没有按照我想要的方式工作。这就是:

它在图像上绘制线条。这条线保持静止;如果我在最初加载时将其绘制在图像的上角,并且我远离它所在的位置,那么该线就不会留在角落里。我相信问题是画布位于图像的顶部,当画布保持静止时,图像在其下方平移。

我该如何解决这个问题?我希望能够在图像本身的某个位置绘制一条线,并且平移和缩放也会影响线条。我想知道是否有一种方法可以创建/解析新图像并在其上绘制必要的线条,然后将 图像加载到查看器中?

另外,我并不依赖这种方法。如果存在一个可以更好地用于我的目的,请告诉我。

谢谢。

0 个答案:

没有答案