Автоматическая прокрутка в верхнем левом углу в Android TouchImageView

Я использую TouchImageView в своем приложении, в котором у меня есть изображение, которое больше, чем размер экрана. Когда я запускаю действие, которое содержит мой TouchImageView, в настоящее время он автоматически показывает центр моего изображения в середине экрана. Я должен вручную (используя жест перетаскивания) сделать верхний левый угол видимости. Однако мне бы хотелось, чтобы по умолчанию верхний левый угол изображения отображался в верхнем левом углу экрана.

Я попытался imgView.setScrollPosition(0,0), но безрезультатно. Я также попытался установить тип масштабирования на "матрицу", но это уменьшит масштаб изображения, в то время как я хочу, чтобы изображение отображалось в его исходном размере. Типы масштабирования fitStart и fitEnd не поддерживаются TouchImageView.

Как я могу прокрутить в верхний левый угол моего TouchImageView?

Вот мой XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.frankd.wttv.TouchImageView
        android:id="@+id/imageView"
        android:layout_width = "wrap_content"
        android:layout_height ="wrap_content"
        android:scaleType="matrix"/>

</LinearLayout>

И вот как я открываю макет и устанавливаю изображение.

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

    //set timetable image
    TouchImageView imgView = (TouchImageView)findViewById(R.id.imageView);
    imgView.setImageResource(R.drawable.myImage);
    //TODO: scroll to top left corner of image
}

1 ответ

Решение

Причиной проблемы является то, что scrollToPosition(x,y) в TouchImageView не использует пиксели x и y в качестве входных данных, а вместо этого представляет число от 0 до 1, которое отражает пропорцию размера изображения.

Также scrollToPosition(x,y) устанавливает точку изображения в центре TouchImageView. Поэтому, если вы вызываете scrollToPosition(0.5,0.5) в TouchImageView, центр изображения отображается в центре TouchImageView. Нам нужно рассчитать, какую точку изображения нужно поместить в центр TouchImageView, чтобы правильно выровнять его.

Я создал функцию scrollToTopLeft() в TouchImageView.java, которая работает, только если вы вызываете ее в конце onMeasure() из файла TouchImageView.java. Если вы вызовете его раньше, getWidth() и getHeight() вернут 0, так как представление еще не было измерено.

public void scrollToTopLeft() {
    try {
        float x, y, viewWidth, viewHeight, viewCenterX, viewCenterY, imageWidth, imageHeight;

        //these calls will only work if called after (or at the end of) onMeasure()
        viewWidth = this.getWidth();
        viewHeight = this.getHeight();

        // get center of view
        viewCenterX = viewWidth / 2;
        viewCenterY = viewHeight / 2;

        // get image height and width
        imageWidth = getImageWidth();
        imageHeight = getImageHeight();

        //calculate the x and y pixels that need to be displayed in at the center of the view
        x = viewWidth / imageWidth * viewCenterX;
        y = viewHeight / imageHeight * viewCenterY;

        //calculate the value of the x and y pixels relative to the image
        x = x / imageWidth;
        y = y / imageHeight;

        setScrollPosition(x, y);

    } catch (Exception E) {
        Log.v(TAG, E.toString());
    }
}
Другие вопросы по тегам