1. ホーム
  2. android

[解決済み] ActionItemのアニメーションアイコン

2023-03-16 14:36:46

質問

私の問題に対する適切な解決策をあらゆるところで探していますが、まだ見つかっていないようです。私はXMLファイルから膨張するメニューを持つActionBar(ActionBarSherlock)を持っており、そのメニューは1つのアイテムを含み、その1つのアイテムはActionItemとして表示されています。

メニューを表示します。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >    
    <item
        android:id="@+id/menu_refresh"       
        android:icon="@drawable/ic_menu_refresh"
        android:showAsAction="ifRoom"
        android:title="Refresh"/>    
</menu>

アクティビティがあります。

[...]
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.mymenu, menu);
    return true;
  }
[...]

ActionItemはアイコンとテキストで表示されますが、ユーザーがActionItemをクリックすると、アイコンがアニメーションし、より具体的にはその場で回転するようにしたいのです。このアイコンはリフレッシュアイコンです。

ActionBar がカスタムビュー ( アクションビューの追加 ) がありますが、このカスタム ビューは ActionBar の全領域をカバーするように拡張され、実際にはアプリアイコン以外のすべてをブロックしてしまいます。

そこで、私の次の試みは、AnimationDrawable を使用して、アニメーションをフレームごとに定義し、drawable をメニュー項目のアイコンとして設定し、次に onOptionsItemSelected(MenuItem item) でアイコンを取得し ((AnimationDrawable)item.getIcon()).start() . しかし、これはうまくいきませんでした。どなたか、この効果を達成する方法をご存知でしょうか?

どのように解決するのですか?

あなたは正しい道を歩んでいます。GitHub Gaug.esアプリがどのように実装されるかは、次のとおりです。

まずアニメーションXMLを定義しています。

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="1000"
    android:interpolator="@android:anim/linear_interpolator" />

次に、アクションビューのレイアウトを定義します。

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_action_refresh"
    style="@style/Widget.Sherlock.ActionButton" />

必要なことは、アイテムがクリックされるたびにこのビューを有効にすることです。

 public void refresh() {
     /* Attach a rotating ImageView to the refresh item as an ActionView */
     LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     ImageView iv = (ImageView) inflater.inflate(R.layout.refresh_action_view, null);

     Animation rotation = AnimationUtils.loadAnimation(getActivity(), R.anim.clockwise_refresh);
     rotation.setRepeatCount(Animation.INFINITE);
     iv.startAnimation(rotation);

     refreshItem.setActionView(iv);

     //TODO trigger loading
 }

読み込みが終わったら、アニメーションを停止し、ビューをクリアするだけです。

public void completeRefresh() {
    refreshItem.getActionView().clearAnimation();
    refreshItem.setActionView(null);
}

そして、あなたは終わりました!

いくつか追加でやることがあります。

  • アクションビューのレイアウトインフレとアニメーションのインフレをキャッシュします。これらは遅いので、一度だけ実行するようにします。
  • 追加 null でチェックします。 completeRefresh()

アプリのプルリクエストはこちらです。 https://github.com/github/gauges-android/pull/13/files