web-dev-qa-db-ja.com

RecyclerViewで現在フォーカスされているアイテムのサイズを増やす方法は?

RecyclerViewを使用して水平方向のリストを作成しようとしています。アイテムにフォーカスを当てると、このサイズが大きくなります。この効果を作りたい:

Increased item effect

これを達成するためのアイデアはありますか?

24
Skycorsarius

dextor 回答のおかげで、この回答を理解することができました。

FocusChangeListenerを使用し、アニメーションの状態を追加して、ビューのサイズを変更しました。

static class ViewHolder extends RecyclerView.ViewHolder {

public ViewHolder(final View root) {
    // bind views
    // ...

    // bind focus listener
    root.setOnFocusChangeListener(new View.OnFocusChangeListener() {
         @Override
         public void onFocusChange(View v, boolean hasFocus) {
             if (hasFocus) {
                 // run scale animation and make it bigger
                 Animation anim = AnimationUtils.loadAnimation(context, R.anim.scale_in_tv);
                 root.startAnimation(anim);
                 anim.setFillAfter(true);
             } else {
                 // run scale animation and make it smaller
                 Animation anim = AnimationUtils.loadAnimation(context, R.anim.scale_out_tv);
                 root.startAnimation(anim);
                 anim.setFillAfter(true);
             }
         }
    });
}

そして、アニメーションのコード:

scale_in_tv:

<scale xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="300"
    Android:fromXScale="100%"
    Android:fromYScale="100%"
    Android:toXScale="110%"
    Android:toYScale="110%"
    Android:pivotX="50%"
    Android:pivotY="50%">
</scale>

scale_out_tv:

<scale xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="100"
    Android:fromXScale="110%"
    Android:fromYScale="110%"
    Android:toXScale="100%"
    Android:toYScale="100%"
    Android:pivotX="50%"
    Android:pivotY="50%">
</scale>
7
Skycorsarius

私はこのようなものを想像しています:

  1. 水平RVを作成する
  2. ViewHolderをバインドするときに、FocusChangeListenerをアイテムのルートビューに添付します。
  3. アイテムがフォーカスを取得したら、拡大して少し大きくします。フォーカスが失われたら、アニメーションを元に戻します。

static class ViewHolder extends RecyclerView.ViewHolder {

  public ViewHolder(View root) {
    // bind views
    // ...

    // bind focus listener
    root.setOnFocusChangeListener(new View.OnFocusChangeListener() {
      @Override
        public void onFocusChange(View v, boolean hasFocus) {
          if (hasFocus) {
            // run scale animation and make it bigger
          } else {
            // run scale animation and make it smaller
          }
        }
     });
  }
}
18
Sebastiano