ギャラリーウィジェットを使用する場合、画像を選択するとスケールアップとグロー、選択解除するとスケールダウンとアングローと表示するにはどうすればよいですか?
私が見たすべてのチュートリアルにはこの効果がありますが、私はそれを見ることができません...
ギャラリーに添付しなければならないアニメーションはありますか?
ギャラリーウィジェットを使用する場合、画像を選択するとスケールアップとグロー、選択解除するとスケールダウンとアングローと表示するにはどうすればよいですか?
私が見たすべてのチュートリアルにはこの効果がありますが、私はそれを見ることができません...
ギャラリーに添付しなければならないアニメーションはありますか?
これが役に立てば幸いです。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 つは、次のように を で識別する行をメソッドに追加することです。ImageView
Gallery
getView()
getView()
View
position
...
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) {
}
}
次のような同様のアニメーションを実装しました。
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) {}
});