11

ギャラリーウィジェットを使用する場合、画像を選択するとスケールアップグロー選択解除するとスケールダウンアングローと表示するにはどうすればよいですか?

私が見たすべてのチュートリアルにはこの効果がありますが、私はそれを見ることができません...

ギャラリーに添付しなければならないアニメーションはありますか?

4

3 に答える 3

15

これが役に立てば幸いです。Galleryウィジェットを使用して縮小/拡大ソリューションを「シミュレート」することができました。を削除したためgetScale()、状況は少し複雑になります。これは最善の解決策ではないと思いますが、少なくとも私はそれを受け入れることができます。

私が見つけたのは、それGalleryが非常に悪いフォーカスを管理していることです。したがって、最初のアプローチは、ImageView表示されたものにフォーカス変更リスナーを追加することでしたが、うまくいきませんでした。フォーカスは混乱です...という点で、選択された画像は現在フォーカスされているビューではありません。focusSearch()APIドキュメントのエラーについて(メソッドといくつかのフォーカスコンタントに関して)android-developersメーリングリストにメールを送信しました。

この問題に対する私の解決策は次のとおりです。

画像を「成長」させるアニメーション リソースを作成します。

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
       android:fromXScale="1.0"
       android:toXScale="1.10"
       android:fromYScale="1.0"
       android:toYScale="1.10"
       android:duration="300"
       android:pivotX="50%"
       android:pivotY="50%"
       android:interpolator="@android:anim/accelerate_decelerate_interpolator"
       android:fillAfter="false"/>

それが何を意味するのか分からない場合は、これを読んでください。

これが 'grow' エフェクトになります。これを保存する必要があります:res/anim/grow.xmlまたは任意の名前で保存する必要があります (ただし、常に res/anim dir に保存します)。

ここからリソース ガイドに従って、ビューを作成できGalleryます。は、オブジェクトが を呼び出すたびにImageAdapterをビルドします。実装できる回避策の 1 つは、次のように を で識別する行をメソッドに追加することです。ImageViewGallerygetView()getView()Viewposition

...
i.setId(position);
...

getView()その行をオブジェクトのメソッドに追加するとImageAdpater、リスナー内でそのビューを明確に識別できます。たとえば、次のようになります。

g.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void  onItemSelected  (AdapterView<?>  parent, View  v, int position, long id) {
        Animation grow = AnimationUtils.loadAnimation(YourActivity.this, R.anim.grow);

        View sideView = parent.findViewById(position - 1);
        if (sideView != null)
           ((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100));

        sideView = parent.findViewById(position + 1);
        if (sideView != null)
           ((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100));

        v.startAnimation(grow);
        v.setLayoutParams(new Gallery.LayoutParams(170, 150));
    }

    public void  onNothingSelected  (AdapterView<?>  parent) {
        System.out.println("NOTHING SELECTED");

    }
    });

注: アニメーションとレイアウト パラメーターのすべての値が手元で選択されていることに気付くかもしれません。これは、コードをきれいにするつもりはないからです。そして、これは、このウィジェットまたは Android ビュー システムでの BAD フォーカスの問題の単なる回避策です。フォーカスに問題がなければ、フォーカス変更リスナーを設定するだけで、フォーカス/非フォーカス時にグロス/縮小を行うことができます。

これがあなたの問題を回避する方法を見つけるのに役立つことを願っています.

よろしく、

新しい編集:これは私が設定したリスナーです。メソッドi.clearAnimation()に次の行も追加しましたgetView():

private class SelectListener implements AdapterView.OnItemSelectedListener {
     private Animation grow;
     private int last;

     public SelectListener() {
        grow = AnimationUtils.loadAnimation(RouteGallery.this, R.anim.grow);
        last = 0;
     }

     public void  onItemSelected  (AdapterView<?>  parent, View  v, int position, long id) {
        View sideView = parent.findViewById(last);
        if (sideView != null && last != position)
           sideView.clearAnimation();

        v.startAnimation(grow);
        last = position;
     }

    public void  onNothingSelected  (AdapterView<?>  parent) {
    }
}
于 2010-07-07T02:37:39.030 に答える
2

次のような同様のアニメーションを実装しました。

final Animation shrink = AnimationUtils.loadAnimation(activity, R.anim.shrink);
shrink.setFillAfter(true);

gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            // This iterates through the views which are currently displayed on screen.
            for (int k=0; k<gallery.getChildCount(); k++){
                // Do whatever else you want, here.
                // This is how you get a particular element of a view
                ImageView background = (ImageView) gallery.getChildAt(k).findViewById(R.id.menu_item_background);

                //clear animation
                gallery.getChildAt(k).clearAnimation();

            }

            // Scale the selected one
            view.startAnimation(shrink);

        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {}

    });
于 2012-10-23T13:44:14.460 に答える