利用ObjectAnimator实现侧滑菜单的效果

objectAnimator是一种焦点可以随着动画移动的动画,下面用一个简单的平移动画的例子,来实现侧滑菜单。
首先是页面主体代码:

package com.example.myobjectanimation;

import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
    /**
     * 显示侧滑菜单
     */
    private static final int MENU_VISIBLE = 0;
    /**
     * 隐藏侧滑菜单
     */
    private static final int MENU_GONE = 1;
    private LinearLayout llMain;
    private LinearLayout llMenu;
    private LinearLayout llMenuRight;
    private LinearLayout llMenuLeft;
    private TextView tvMain;

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

    private void init() {
        llMain = (LinearLayout) findViewById(R.id.ll_main);
        llMain.setOnClickListener(this);
        llMenu = (LinearLayout) findViewById(R.id.ll_menu);
        llMenu.setOnClickListener(this);
        llMenuLeft = (LinearLayout) findViewById(R.id.ll_menu_left);
        llMenuLeft.setOnClickListener(this);
        llMenuRight = (LinearLayout) findViewById(R.id.ll_menu_right);
        llMenuRight.setOnClickListener(this);
        tvMain = (TextView) findViewById(R.id.tv_main);
        tvMain.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.ll_menu_left:
            setLayoutType(MENU_GONE);
            break;
        case R.id.tv_main:
            setLayoutType(MENU_VISIBLE);
            break;
        default:
            break;
        }
    }

    /**
     * 控制显隐状态
     * 
     * @param type
     *            区分显示隐藏
     */
    private void setLayoutType(int type) {
        switch (type) {
        case MENU_VISIBLE:
            llMenu.setVisibility(View.VISIBLE);
            llMain.setFocusable(false);
            startAnimation(MENU_VISIBLE);
            break;
        case MENU_GONE:
            startAnimation(MENU_GONE);
            break;
        default:
            break;
        }
    }

    /**
     * 设置显示隐藏动画
     * 
     * @param type
     *            区分显示隐藏
     */
    private void startAnimation(int type) {
        switch (type) {
        case MENU_VISIBLE:
            ObjectAnimator oa = ObjectAnimator.ofFloat(llMenuRight, "translationX", 0, getWidth() / 3 * 2);
            oa.setDuration(0);
            oa.start();
            oa.addListener(new AnimatorListener() {

                @Override
                public void onAnimationStart(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }

                @Override
                public void onAnimationEnd(Animator animation) {
                    ObjectAnimator oa2 = ObjectAnimator.ofFloat(llMenuRight, "translationX", getWidth() / 3 * 2, 0);
                    oa2.setDuration(200);
                    oa2.start();
                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }
            });

            break;
        case MENU_GONE:
            ObjectAnimator oa2 = ObjectAnimator.ofFloat(llMenuRight, "translationX", 0, getWidth() / 3 * 2);
            oa2.setDuration(200);
            oa2.start();
            oa2.addListener(new AnimatorListener() {

                @Override
                public void onAnimationStart(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }

                @Override
                public void onAnimationEnd(Animator animation) {
                    llMenu.setVisibility(View.GONE);
                    llMain.setFocusable(true);
                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }
            });
            break;
        default:
            break;
        }
    }

    /**
     * 获取屏幕宽度
     * 
     * @return 屏幕宽度
     */
    private int getWidth() {
        // 获取屏幕的长宽像素
        DisplayMetrics dm = new DisplayMetrics();
        // 此处this为一个activity
        this.getWindowManager().getDefaultDisplay().getMetrics(dm);
        return dm.widthPixels;
    }
}

然后是布局界面,简单两个界面,一个显示一个隐藏,在代码中利用动画和显示隐藏交替实现来模拟侧滑菜单效果:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/ll_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/tv_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="主页面"
            android:textSize="25sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/ll_menu"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#aa2c2c32"
        android:orientation="horizontal"
        android:visibility="gone" >

        <LinearLayout
            android:id="@+id/ll_menu_left"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#00000000"
            android:orientation="vertical" >
        </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_menu_right"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:background="#ffffff"
            android:orientation="vertical" >

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="侧滑菜单"
                android:textColor="#000000"
                android:textSize="25sp" />
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

利用这个小界面可以实现一些轻量级的侧滑菜单的应用,而且不用导入什么三方包,可以减少程序的臃肿度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值