Android: прокрутка изображения

У меня есть ImageView, который в два раза превышает высоту экрана нормалей (960 dip). Я хотел бы прокручивать его красиво вверх и вниз по экрану. В нижней части экрана должна быть кнопка. Я пробовал различные комбинации ScrollView и Imageviews без каких-либо успехов. Я также думаю с атрибутом: isScrollContainer без результатов. Кто-нибудь знает, как это сделать? Ура, Лука

4b9b3361

@cV2 Большое вам спасибо за этот код. Это заставило меня идти в том направлении, в котором я нуждался. Здесь моя модифицированная версия, которая перестает прокручиваться по краям изображения...

    // set maximum scroll amount (based on center of image)
    int maxX = (int)((bitmapWidth / 2) - (screenWidth / 2));
    int maxY = (int)((bitmapHeight / 2) - (screenHeight / 2));

    // set scroll limits
    final int maxLeft = (maxX * -1);
    final int maxRight = maxX;
    final int maxTop = (maxY * -1);
    final int maxBottom = maxY;

    // set touchlistener
    ImageView_BitmapView.setOnTouchListener(new View.OnTouchListener()
    {
        float downX, downY;
        int totalX, totalY;
        int scrollByX, scrollByY;
        public boolean onTouch(View view, MotionEvent event)
        {
            float currentX, currentY;
            switch (event.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                    downX = event.getX();
                    downY = event.getY();
                    break;

                case MotionEvent.ACTION_MOVE:
                    currentX = event.getX();
                    currentY = event.getY();
                    scrollByX = (int)(downX - currentX);
                    scrollByY = (int)(downY - currentY);

                    // scrolling to left side of image (pic moving to the right)
                    if (currentX > downX)
                    {
                        if (totalX == maxLeft)
                        {
                            scrollByX = 0;
                        }
                        if (totalX > maxLeft)
                        {
                            totalX = totalX + scrollByX;
                        }
                        if (totalX < maxLeft)
                        {
                            scrollByX = maxLeft - (totalX - scrollByX);
                            totalX = maxLeft;
                        }
                    }

                    // scrolling to right side of image (pic moving to the left)
                    if (currentX < downX)
                    {
                        if (totalX == maxRight)
                        {
                            scrollByX = 0;
                        }
                        if (totalX < maxRight)
                        {
                            totalX = totalX + scrollByX;
                        }
                        if (totalX > maxRight)
                        {
                            scrollByX = maxRight - (totalX - scrollByX);
                            totalX = maxRight;
                        }
                    }

                    // scrolling to top of image (pic moving to the bottom)
                    if (currentY > downY)
                    {
                        if (totalY == maxTop)
                        {
                            scrollByY = 0;
                        }
                        if (totalY > maxTop)
                        {
                            totalY = totalY + scrollByY;
                        }
                        if (totalY < maxTop)
                        {
                            scrollByY = maxTop - (totalY - scrollByY);
                            totalY = maxTop;
                        }
                    }

                    // scrolling to bottom of image (pic moving to the top)
                    if (currentY < downY)
                    {
                        if (totalY == maxBottom)
                        {
                            scrollByY = 0;
                        }
                        if (totalY < maxBottom)
                        {
                            totalY = totalY + scrollByY;
                        }
                        if (totalY > maxBottom)
                        {
                            scrollByY = maxBottom - (totalY - scrollByY);
                            totalY = maxBottom;
                        }
                    }

                    ImageView_BitmapView.scrollBy(scrollByX, scrollByY);
                    downX = currentX;
                    downY = currentY;
                    break;

            }

            return true;
        }
    });

Я уверен, что его можно немного уточнить, но он работает очень хорошо.:)

28
ответ дан 17 сент. '10 в 5:52
источник

Я так долго искал этот код, поэтому хотел разделить этот отличный мир кода:

этот код из Activity, который имеет xml файл на бэкэнд , содержащий ImageView, называемый 'img'

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/img"
    android:scaleType="center"
    android:background="#fff"
    android:src="@drawable/picName"
/>

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.xml_name_layout);

    final ImageView switcherView = (ImageView) this.findViewById(R.id.img);

    switcherView.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View arg0, MotionEvent event) {

            float curX, curY;

            switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    mx = event.getX();
                    my = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    curX = event.getX();
                    curY = event.getY();
                    switcherView.scrollBy((int) (mx - curX), (int) (my - curY));
                    mx = curX;
                    my = curY;
                    break;
                case MotionEvent.ACTION_UP:
                    curX = event.getX();
                    curY = event.getY();
                    switcherView.scrollBy((int) (mx - curX), (int) (my - curY));
                    break;
            }

            return true;
        }
    });

}

сделал работу отлично для меня... включена горизонтальная и вертикальная прокрутка (включено)

только отрицательная сторона... вы можете прокручивать край изображения... но это не проблема для меня.. и потратив некоторое время, вы можете легко реализовать эту функцию:)

удача и & получать удовольствие

26
ответ дан 21 июня '10 в 2:31
источник

вот как я его исправил: p

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbarAlwaysDrawVerticalTrack="true" >

<ImageView
    android:contentDescription="Specs"
    android:adjustViewBounds="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:src="@drawable/specs" >
</ImageView>

11
ответ дан 11 нояб. '14 в 2:42
источник

@wirbly Большое вам спасибо за ваш код, он работает именно так, как я хочу. Но когда я впервые прочитал ваш код, я немного смутился насчет четырех переменных, которые вы забыли определить.

Итак, я хочу добавить определение для кода, чтобы сделать его более понятным.

Resources res=getResources();
Bitmap mBitmap = BitmapFactory.decodeResource(res, R.drawable.p_1920x1080); 
BitmapDrawable bDrawable = new BitmapDrawable(res, mBitmap);

//get the size of the image and  the screen
int bitmapWidth = bDrawable.getIntrinsicWidth();
int bitmapHeight = bDrawable.getIntrinsicHeight();
int screenWidth = this.getWindowManager().getDefaultDisplay().getWidth();  
int screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();

Надеюсь, что это будет полезно.

6
ответ дан 16 апр. '12 в 19:38
источник

Самый простой способ - использовать imho, чтобы использовать веб-просмотр и загружать изображение в него через локальный html файл. Таким образом, вы также автоматически получите элементы управления масштабированием, если хотите их использовать. Для большого изображения (т.е. Если оно равно 1000 или 3000 пикселей в ширину) вы заметите, что Android (Coliris) не очень хорошо отображает большие увеличенные изображения очень резкие, даже если исходные изображения четкие и несжатые). Это известная проблема. Решением для этого является разбиение большого изображения на более мелкие фрагменты и объединение их снова через html (div или table). Я использую этот подход, чтобы предоставить пользователю карту метро (большую, чем экран и прокручиваемую).

    WebView webView = (WebView)findViewById(R.id.webView);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);

    webView.loadUrl( "content://com.myapp.android.localfile/sdcard/myappdata/common/mtr_map.html");

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

Вместо html файла вы также можете загрузить изображение напрямую (png, jpg). Если вы не хотите управлять зуммированием, просто отключите их.

6
ответ дан 17 июня '10 в 7:52
источник

Другой способ - создать HorizontalScrollView, добавить в него imageView, а затем добавить HorizontalScrollView в ScrollView. Это позволяет прокручивать вверх, вниз, влево, вправо.

2
ответ дан 12 июля '11 в 17:43
источник

он работает для меня

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/img"
            android:scaleType="centerCrop"
            android:adjustViewBounds="true"/>

        <Button
            style="@style/btn"
            android:id="@+id/btn"
            android:layout_height="60dp"
            android:layout_marginTop="20dp"
            android:background="@drawable/btn"
            android:onClick="click"
            android:text="text" />
    </LinearLayout>

</ScrollView>
1
ответ дан 14 июля '16 в 9:05
источник

Ребята нашли легкое и 100% надежное решение, как упоминалось выше г-н Х (поскольку другие упомянутые коды не работали над некоторыми устройствами или ломали) Просто используйте ScrollView, предоставляемый android, и он заботится о вещах

что-то вроде этого

<ScrollView android:layout_width="fill_parent" android:id="@+id/scrollView1"
        android:layout_height="wrap_content" android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true" android:layout_above="@+id/button1"
        android:layout_alignParentRight="true" android:scrollbarAlwaysDrawVerticalTrack="true">
        <LinearLayout android:id="@+id/linearLayout1"
            android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal">
            <ImageView android:src="@android:drawable/ic_menu_report_image"
                android:layout_height="wrap_content" android:id="@+id/imageView1"
                android:layout_width="wrap_content"></ImageView>
        </LinearLayout>
    </ScrollView>

и в создании чего-то вроде этого

if (mImageName != null) {
        InputStream is = null;
        try {
            is = this.getResources().getAssets().open("mathematics/"+mImageName);
        } catch (IOException e) {
        }
        Bitmap image = BitmapFactory.decodeStream(is);

        mImageView.setImageBitmap(image);
}

Ура!

0
ответ дан 17 нояб. '11 в 15:05
источник