いくつかの画像をギャラリーにロードしました。これでスクロールできるようになりましたが、一度スクロールを開始するとスクロールが停止しません。ギャラリーで次の画像にスクロールして、ユーザーがもう一度スクロールジェスチャを実行するまで停止したいと思います。
これは私のコードです
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>
ギャラリーで一度に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;
}
これは私のために働いたコードです。
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;
}
楽しい!
簡単な方法は次のとおりです。
@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の次のオーバーライドは、小さなスワイプと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
メソッドを使用しています)
何もする必要はありません単に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、私は文字通りこれをいくつかのコードに接続しました、そしてそれはうまくいきました!うーん、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);
}
}