Intereting Posts
Как расширить класс Android, который реализует интерфейс Parcelable? Десятичная запятая или десятичная запятая в Android Подождите, пока потоки будут завершены, прежде чем продолжить Java-сокет не бросает исключения на мертвый сокет? Gradle. Как сгенерировать исходный код перед компиляцией в приложении для Android Проблема масштабирования ViewPager и ImageView IOS / Android: разработка приложения, все-родной или PhoneGap? Я использую SQLCIPHER для чтения или записи базы данных Вызвать метод фрагмента из адаптера Разработка на Android-устройстве через беспроводную сеть Если я отправлю исправление пользователю, будут ли они продолжать получать обновления из Play Маркета? Не может получить доступ к памяти по адресу 0X1 после настройки gdb и eclipse для отладки общей библиотеки из приложения Android Как изменить тему приложения Android? Разработка кросс-платформенной платформы iOS / Android Что происходит с сообщением «Неожиданное возобновление сообщения <packagename> в то время как уже возобновлено» на Android?

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

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

Solutions Collecting From Web of "Android: прокрутка изображения"

@ 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; } }); 

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

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

Этот код из 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; } }); } 

Отлично справилась со мной … Горизонтальная и вертикальная прокрутка включена (включена)

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

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

Вот как я его исправил: 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> 

Самый простой способ – использовать imho для использования webview и загрузить изображение в него через локальный 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). Если вы не хотите управлять зуммированием, просто выключите их.

@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(); 

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

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

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

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

 <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> 

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

 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); } 

Ура!

меня устраивает

 <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>