прокрутите изображение больше экрана и остановитесь на его границе на Android - PullRequest
4 голосов
/ 10 августа 2010

Я знаю, как отобразить изображение, которое больше экрана.Это довольно просто и подробно объяснено здесь , однако, этот метод позволяет вам прокручивать, насколько вы хотите, событие, если вы оставили изображение и у вас просто черный экран.Я хотел бы знать, как мы можем остановить прокрутку, когда достигнем края изображения ...

Ответы [ 3 ]

5 голосов
/ 18 августа 2010

Загрузите ваше изображение в WebView.После этого вы получите все необходимые варианты прокрутки и даже стандартные элементы управления масштабированием, если вы решите включить их ... практически бесплатно.Единственным другим вариантом (насколько мне известно) было бы использование API-интерфейсов для 2D-графики (Canvas и т. Д.) И создание собственной версии листов для рисования (например, просмотр части карты).

Если ваше изображениеявляется локальным, посмотрите на этот пример чтения локальных данных изображения в с SD-карты .В этом случае более чистым подходом к обслуживанию локального изображения будет создание ContentProvider и доступ к ресурсу через URL-адрес content: // в вашем WebView.

Пример использования связанного изображения car.jpg в assets каталог вашего проекта:

res / layout / main.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">
    <WebView
      android:id="@+id/web"
      android:layout_width="150dip"
      android:layout_height="150dip"
    />
</LinearLayout>

src / ImageViewer.java

public class ImageViewer extends Activity {

  WebView webView;
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    webView = (WebView)findViewById(R.id.web);
    webView.loadUrl("file:///android_asset/car.jpg");
  }
}

Для изображения, связанного с вашим проектом,это самый простой способ.Это не работает с изображениями в вашем каталоге ресурсов (например, res / drawable).Этот путь не стоит кода, необходимого для его завершения.

0 голосов
/ 15 февраля 2016

Ну, у меня была та же проблема, вот мое решение:

  Display display = getWindowManager().getDefaultDisplay();
    screenSize = new Point();
    display.getSize(screenSize);

Получите размер экрана, потребуется установить нижнюю и правую границы

image.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            float curX, curY;

            switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    mx = event.getX();
                    my = event.getY();
                    rect = image.getDrawable().getBounds();
                    break;
                case MotionEvent.ACTION_MOVE:
                    curX = event.getX();
                    curY = event.getY();
                    image.scrollBy(getX((int) (mx - curX)), getY((int) (my - curY)));
                    mx = curX;
                    my = curY;
                    break;
            }
            return true;
        }
    });

и наконец два метода дляновые координаты прокрутки

private int getX(int x){
    if (image.getScrollX() + x < 0 ){ //left side 
        return 0;
    } else if (image.getScrollX() + x >= (rect.right - screenSize.x)){ //right side
        return 0;
    } else {
        return x;
    }
}

private int getY(int y){
    if (image.getScrollY() + y < 0 ){  //top side 
        return 0;
    } else if (image.getScrollY() + y >= (rect.bottom - screenSize.y)){ //bottom side
        return 0;
    } else {
        return y;
    }
} 

Отлично работает API 16+, надеюсь, это поможет

0 голосов
/ 23 августа 2010

В вашей Activity.onCreate ():

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(...);

Я не был уверен, какой именно макет вы имеете в виду, поэтому выкладываю 2 версии:

Версия 1 (кнопка под изображением):

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

    <ScrollView android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:layout_weight="1"
        android:fadingEdge="none" android:scrollbars="none">

        <ImageView android:id="@+id/image" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:scaleType="center" />

    </ScrollView>

    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:text="OK"
        android:layout_gravity="center" />

</LinearLayout>

Версия 2 (кнопка над изображением - по оси Z):

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

    <ScrollView android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:fadingEdge="none"
        android:scrollbars="none">

        <ImageView android:id="@+id/image" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:scaleType="center" />

    </ScrollView>

    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:text="OK"
        android:layout_gravity="bottom|center_horizontal" />

</FrameLayout>

Вы также можете попробовать поместить ScrollView внутри HorizontalScrollView.

...