web-dev-qa-db-ja.com

ギャラリーウィジェットでスクロールを停止するにはどうすればよいですか?

いくつかの画像をギャラリーにロードしました。これでスクロールできるようになりましたが、一度スクロールを開始するとスクロールが停止しません。ギャラリーで次の画像にスクロールして、ユーザーがもう一度スクロールジェスチャを実行するまで停止したいと思います。

これは私のコードです

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

ギャラリーで一度に1つのビューのみをスクロールする方法と、最小のスワイプ長でアニメーションをトリガーできる方法の両方を実現する方法を見つけたと思います。

ギャラリーウィジェットの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;  
}
48
Nadewad

これは私のために働いたコードです。

Nadewadのソリューション+いくつかのアニメーション速度の調整:

Galleryを拡張するクラスを作成し、このメソッドをオーバーライドします。

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

楽しい!

12
peceps

簡単な方法は次のとおりです。

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

こちらでも確認できます: Android Infinite Loop Gallery

3
James

これを実現するために私が見つけた最も簡単な方法は、Gallery onFlingメソッドをオーバーライドし、独自のvelocityX値を提供することです。

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

それは完璧ではありませんが、それは仕事をします。理想的には、onFlingのカスタムを作成して、希望どおりに機能させることができます。

2
Tim H

OnFlingの次のオーバーライドは、小さなスワイプと1ページのページ付けに十分に機能することがわかりました。

@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の値は十分に良い結果を提供するようですが、好みに合わせて調整することができます。

(注:これは、 @ Nadewadの回答 に示されているisScrollingLeftメソッドを使用しています)

2
dijipiji

何もする必要はありません単に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;  
}

それは私のために働いた

2
anshul

ああ、助かった!!! OMG、私は文字通りこれをいくつかのコードに接続しました、そしてそれはうまくいきました!うーん、48時間まっすぐで、私は自分の答えを完璧なグーグル検索をするだけでよいと思いました。文字通り、プラグアンドプレイ。本当にありがとう。

新しいコード

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