Intereting Posts
Странный разделитель с панелью поддержки v7 Ошибка «Вы не должны вызывать setTag () при просмотре. Glide нацеливается на« когда используется Glide Как рисовать круговую диаграмму вручную в Android? Должен ли я вызвать super () или вызвать этот () для конструкторов пользовательского вида android? Outofmemoryerror при создании растрового изображения Webview не отображает шрифт Гуджарати Выборочный API сервисов Google Play не находит классы Android – создать форму стрелки с помощью xml Как установить ProxySettings и ProxyProperties на Android Wi-Fi соединение с помощью Java? Как создать пользовательскую кнопку в Android с помощью стилей XML Как проверить, был ли изменен EditText или нет? Базовая аутентификация не работает с Android до Sharepoint 2013 Панель инструментов – переход от кнопки выдвижения к задней панели только с одним действием HttpUnit / HtmlUnit эквивалент для Android Почему Android использует концепцию Java вместо языка D или C или C ++? Но веб-браузер Chromium находится на C ++, его очень сложное совпадение

Как остановить прокрутку в виджетах галереи?

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

Это мой код

import android.widget.ImageView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; public class GalleryExample extends Activity { private Gallery gallery; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); gallery = (Gallery) findViewById(R.id.examplegallery); gallery.setAdapter(new AddImgAdp(this)); gallery.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { Toast.makeText(GalleryExample.this, "Position=" + position, Toast.LENGTH_SHORT).show(); } }); } public class AddImgAdp extends BaseAdapter { int GalItemBg; private Context cont; private Integer[] Imgid = { R.drawable.a_1, R.drawable.a_2, R.drawable.a_3, R.drawable.a_4, R.drawable.a_5, R.drawable.a_6, R.drawable.a_7 }; public AddImgAdp(Context c) { cont = c; TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme); GalItemBg = typArray.getResourceId(R.styleable.GalleryTheme_android_galleryItemBackground, 0); typArray.recycle(); } public int getCount() { return Imgid.length; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ImageView imgView = new ImageView(cont); imgView.setImageResource(Imgid[position]); i.setScaleType(ImageView.ScaleType.FIT_CENTER); imgView.setBackgroundResource(GalItemBg); return imgView; } } 

}

И файл xmlLayout

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" > <Gallery xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/examplegallery" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

Solutions Collecting From Web of "Как остановить прокрутку в виджетах галереи?"

Я думаю, что я нашел способ добиться как прокрутки только одного вида за один раз в галерее, так и возможности иметь минимальную длину салфетки для запуска анимации.

Переопределите метод onFling виджета галереи и вместо вызова super.onFling проверьте, не было ли прокрутка слева и справа или справа налево, и вызовите соответствующее событие dpad, как показано ниже:

 private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ return e2.getX() > e1.getX(); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ int kEvent; if(isScrollingLeft(e1, e2)){ //Check if scrolling left kEvent = KeyEvent.KEYCODE_DPAD_LEFT; } else{ //Otherwise scrolling right kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; } onKeyDown(kEvent, null); return true; } 

Это код, который работал для меня.

Решение Nadewad + некоторые корректировки скорости анимации:

Создайте класс, расширяющий галерею, и переопределите эти методы:

  @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { setAnimationDuration(600); return super.onScroll(e1, e2, distanceX, distanceY); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float velMax = 2500f; float velMin = 1000f; float velX = Math.abs(velocityX); if (velX > velMax) { velX = velMax; } else if (velX < velMin) { velX = velMin; } velX -= 600; int k = 500000; int speed = (int) Math.floor(1f / velX * k); setAnimationDuration(speed); int kEvent; if (isScrollingLeft(e1, e2)) { // Check if scrolling left kEvent = KeyEvent.KEYCODE_DPAD_LEFT; } else { // Otherwise scrolling right kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; } onKeyDown(kEvent, null); return true; } 

Наслаждайтесь!

Легкий способ:

 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return super.onFling(e1, e2, 0, velocityY); } 

Вы также можете проверить здесь: Android Infinite Loop Gallery

Самый простой способ, который я нашел для этого, – переопределить метод Gallery onFling и предоставить собственное значение velocityX:

 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return super.onFling(e1, e2, 10, velocityY); } 

Это не идеально, но он выполняет эту работу. В идеале вы, вероятно, напишете что-то обычное для onFling, чтобы заставить его работать точно так, как вам нравится.

Я обнаружил, что следующее переопределение на onFling работает достаточно хорошо для небольших прокруток и разбиения на страницы одной страницы:

 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { boolean leftScroll = isScrollingLeft(e1, e2); float velX; if(leftScroll) { velX=500; } else { velX=-500; } return super.onFling(e1, e2, velX, velocityY); } 

Значение velX + -500, по-видимому, обеспечивает достаточно хороший результат, но может быть настроено в соответствии с вашими предпочтениями.

(Примечание: это используется метод isScrollingLeft представленный в ответе @ Nadewad )

Не нужно ничего делать, просто верните false

 private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ return e2.getX() > e1.getX(); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ return false; } 

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

СЛАВА БОГУ!!! OMG, я буквально подключил это к некоторому коду, и он РАБОТАЛ! Ugh, 48 часов прямо и думать, что мне нужно только сделать идеальный поиск Google для моего ответа. Буквально подключи и играй. Спасибо.

Новый код

 public class CustomGallery extends Gallery { public CustomGallery(Context context) { super(context); } public CustomGallery(Context context, AttributeSet attrs) { super(context, attrs); } public CustomGallery(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ return e2.getX() > e1.getX(); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ int kEvent; if(isScrollingLeft(e1, e2)){ //Check if scrolling left kEvent = KeyEvent.KEYCODE_DPAD_LEFT; } else{ //Otherwise scrolling right kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; } onKeyDown(kEvent, null); return true; } } 

Старый код: для сравнения

  public class CustomGallery extends Gallery { public CustomGallery(Context context) { super(context); } public CustomGallery(Context context, AttributeSet attrs) { super(context, attrs); } public CustomGallery(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { //Do something specific here. return super.onScroll(e1, e2, distanceX, distanceY); } }