ギャラリー ウィジェットに垂直スワイプを実装するために書いたコードがいくつかあります。Android 1.5 と 1.6 では問題なく動作しますが、Android 2.2 では動作しません (2.1 ではまだ試していません)。
public class SwipeUpDetector extends SimpleOnGestureListener
implements OnTouchListener
{
private GestureDetector m_detector;
public SwipeUpDetector()
{
m_detector = new GestureDetector(m_context, this);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{
if (Math.abs(e1.getX() - e2.getX()) < s_swipeMaxOffPath &&
e1.getY() - e2.getY() >= s_swipeMinDistance &&
Math.abs(velocityY) >= s_swipeMinVelocity)
{
int pos = m_gallery.pointToPosition((int)e1.getX(), (int)e2.getY());
startAnimation(pos);
return true;
}
return false;
}
@Override
public boolean onTouch(View v, MotionEvent event)
{
return m_detector == null ? false : m_detector.onTouchEvent(event);
}
}
ギャラリーで onFling を検出できるようにするには、次のようにします。
m_gallery.setOnTouchListener(new SwipeUpDetector());
Android 1.5 および 1.6 では、これはうまく機能します。Android 2.2 では onFling() は呼び出されません。Google と StackOverflow を調べてみると、onDown() を実装して true を返すことが 1 つの解決策であることがわかりました。
ただし、シングル クリックもリッスンしており、このギャラリーにコンテキスト メニュー リスナーを設定しています。onDown() を実装して true を返すと、実際にスワイプが機能します。しかし、これを行うと、長いクリックでコンテキストメニューが表示されず、シングルクリックも機能しません...ギャラリー内のアイテムをクリックすると、ギャラリーがジャンプし、フィードバックが得られませんギャラリー内のアイテムをクリックします。すぐにそのアイテムが選択されたアイテムになり、中央に移動します。
1.6、2.1、および 2.2 の API の相違点レポートを確認しましたが、これが壊れる原因となる重要なものは見当たりませんでした...
私は何を間違っていますか?
編集:
次のように、ギャラリーがいくつかのレイアウト内にネストされていることを知っておくと役立つ場合もあります (これは完全なレイアウトではありません... このギャラリーが存在する場所の階層を示すことだけを目的としています)。
<ScrollView>
<LinearLayout>
<RelativeLayout> <!-- This relative layout is a custom one that I subclassed -->
<Gallery />
</RelativeLayout>
</LinearLayout>
</ScrollView>
編集#2:
リクエストされたレイアウトは次のとおりです。再利用のために 2 つあります。メイン アクティビティのレイアウトである最初のものを次に示します。
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myns="http://com.magouyaware/appswipe"
android:id="@+id/main_layout_id"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_horizontal"
android:scrollbarAlwaysDrawVerticalTrack="false"
>
<LinearLayout
android:id="@+id/appdocks_layout_id"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="10dp"
android:layout_gravity="center"
android:orientation="vertical"
android:gravity="center"
android:background="@null"
>
<com.magouyaware.appswipe.TitledGallery
android:id="@+id/running_gallery_layout_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:visibility="gone"
myns:gallery_title="@string/running_title"
/>
<com.magouyaware.appswipe.TitledGallery
android:id="@+id/recent_gallery_layout_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:visibility="gone"
myns:gallery_title="@string/recent_title"
/>
<com.magouyaware.appswipe.TitledGallery
android:id="@+id/favs_gallery_layout_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:visibility="gone"
myns:gallery_title="@string/favs_title"
/>
<com.magouyaware.appswipe.TitledGallery
android:id="@+id/service_gallery_layout_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:visibility="gone"
myns:gallery_title="@string/service_title"
/>
<com.magouyaware.appswipe.TitledGallery
android:id="@+id/process_gallery_layout_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:visibility="gone"
myns:gallery_title="@string/process_title"
/>
<include
android:id="@+id/indeterminate_progress_layout_id"
layout="@layout/indeterminate_progress_layout"
/>
</LinearLayout>
</ScrollView>
com.magouyaware.appswipe.TitledGallery のレイアウト ファイルは次のとおりです。これは、複数のビューをコード内の 1 つの項目として制御し、再利用できるようにするための RelativeLayout サブクラスにすぎません。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/titled_gallery_main_layout_id"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:layout_gravity="center_vertical"
android:background="@null"
>
<LinearLayout
android:id="@+id/titled_gallery_expansion_layout_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:focusable="true"
android:clickable="true"
android:gravity="center_vertical"
>
<ImageView
android:id="@+id/titled_gallery_expansion_image_id"
android:layout_width="20dp"
android:layout_height="20dp"
android:duplicateParentState="true"
android:clickable="false"
/>
<TextView
style="@style/TitleText"
android:id="@+id/titled_gallery_title_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:paddingLeft="1sp"
android:paddingRight="10sp"
android:textColor="@drawable/titled_gallery_text_color_selector"
android:duplicateParentState="true"
android:clickable="false"
/>
</LinearLayout>
<Gallery
android:id="@+id/titled_gallery_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/titled_gallery_expansion_layout_id"
android:layout_alignWithParentIfMissing="true"
android:spacing="5sp"
android:clipChildren="false"
android:clipToPadding="false"
android:unselectedAlpha=".5"
android:focusable="false"
/>
<TextView
style="@style/SubTitleText"
android:id="@+id/titled_gallery_current_text_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/titled_gallery_id"
android:layout_alignWithParentIfMissing="true"
android:gravity="center_horizontal"
/>
</RelativeLayout>