📜  颤振自定义应用栏 (1)

📅  最后修改于: 2023-12-03 15:28:57.625000             🧑  作者: Mango

颤振自定义应用栏

自定义应用栏在移动应用开发中非常常见,而其中一个重要特性就是颤振。颤振可以让应用栏在用户滑动屏幕时增加动态感,提高用户体验。

在本文中,我们将介绍如何在Android应用中实现一个颤振自定义应用栏。

实现步骤
步骤一:创建布局文件

我们首先需要创建一个布局文件来定义自定义应用栏的样式。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:background="@color/colorPrimary">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textColor="@android:color/white"/>

</RelativeLayout>

上面的代码定义了一个50dp高的RelativeLayout,其中包含一个TextView。

步骤二:创建自定义应用栏类

我们需要创建一个自定义View作为自定义应用栏的容器,并实现颤振的逻辑。代码如下:

public class ShakyToolbar extends RelativeLayout {

    private static final int SHAKE_OFFSET_DP = 4;

    private float mShakeOffset;
    private boolean mShakeDirectionRight = true;
    private boolean mShaking = false;
    private View mTitleView;

    public ShakyToolbar(Context context) {
        super(context);
        init(context);
    }

    public ShakyToolbar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public ShakyToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        mShakeOffset = TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP,
                SHAKE_OFFSET_DP,
                context.getResources().getDisplayMetrics()
        );
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mTitleView = findViewById(R.id.title);
    }

    public void startShaking() {
        if (mShaking) {
            return;
        }
        shake();
    }

    public void stopShaking() {
        mShaking = false;
    }

    private void shake() {
        mShaking = true;
        mTitleView.animate()
                .translationX(mShakeDirectionRight ? mShakeOffset : -mShakeOffset)
                .setDuration(100)
                .withEndAction(new Runnable() {
                    @Override
                    public void run() {
                        if (mShaking) {
                            mShakeDirectionRight = !mShakeDirectionRight;
                            shake();
                        }
                    }
                })
                .start();
    }
}

上面的代码中,我们定义了一个自定义View,它继承自RelativeLayout。在init()方法中,我们定义了颤振时的偏移量,同时在onFinishInflate()方法中获取了自定义应用栏中的TextView。

startShaking()方法将导致应用栏开始颤振,而stopShaking()方法将使其停止。

在shake()方法中,我们使用了平移动画来实现颤振的效果。如果动画完成后,应用栏仍然需要继续颤振,则会递归调用shake()方法。

步骤三:在Activity中使用自定义应用栏

最后,我们需要在Activity中使用这个自定义应用栏。代码如下:

public class MainActivity extends AppCompatActivity {

    private ShakyToolbar mShakyToolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mShakyToolbar = (ShakyToolbar) findViewById(R.id.shaky_toolbar);

        if (mShakyToolbar != null) {
            mShakyToolbar.startShaking();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mShakyToolbar != null) {
            mShakyToolbar.stopShaking();
        }
    }
}

上面的代码在Activity的onCreate()方法中获取了自定义应用栏并开始颤振,而在onStop()方法中停止颤振。

总结

通过实现上述步骤,我们已经实现了一个Android中的颤振自定义应用栏。这个自定义应用栏可以提高用户体验,增加应用的动态感,并使应用更加现代化。

实现代码:https://github.com/AIYANGYANG666/CustomToolbar