Android手势下拉抽屉效果
  ttOzQgS7km1w 2023年12月12日 21 0


 效果

手势拖动底部滑动上面,图二中拖动下拉

Android手势下拉抽屉效果_LinearLayout实现上下抽屉


Android手势下拉抽屉效果_Android抽屉效果_02

图二

Activity实现

package me.maxd.demo.activity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import me.maxd.demo.R;


/**
 * 处理lin和手势拖动的实现 设置最小回退位置 最大回退位置 设置速度 手势速度
 */
public class TestActivity extends AppCompatActivity implements View.OnTouchListener, GestureDetector.OnGestureListener {
    //滚动布局
    LinearLayout show;
    //滑动按钮
    Button btn;
    //动态改变布局用
    private RelativeLayout.LayoutParams linearParams;
    //配合ontouch使用,手势监听
    private GestureDetector mGestureDetector;
    int phone_high;//屏幕的高度
    int stop_high;//需要停留的位置
    int small_high = 260;//最小位置
    int speed = 50;//自动展开或收回的滑动速率,默认为50,大小自己设,越大越快
    //设定定时器用来自动弹回和弹出
    Handler myHanlder = new Handler();
    Runnable run = new Runnable() {
        @SuppressLint("ClickableViewAccessibility")
        @Override
        public void run() {
            //向上收回
            if (stop_high == small_high) {
                if (linearParams.height > stop_high) {
                    //速率自己调
                    linearParams.height = linearParams.height - speed;
                    show.setLayoutParams(linearParams); // 使设置好的布局参数应用到控件
                    // 递归
                    myHanlder.postDelayed(run, 1);

                }
                //向下展开
            } else if (stop_high == phone_high) {
                if (linearParams.height < stop_high) {
                    linearParams.height = linearParams.height + speed;
                    show.setLayoutParams(linearParams); // 使设置好的布局参数应用到控件
                    // 递归
                    myHanlder.postDelayed(run, 1);
                }
            }

        }
    };

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        show = (LinearLayout) findViewById(R.id.show);
        btn = (Button) findViewById(R.id.btn);
        // 取控件当前的布局参数
        linearParams = (RelativeLayout.LayoutParams) show.getLayoutParams();
        btn.setOnTouchListener(this);
        mGestureDetector = new GestureDetector(this, this);
        mGestureDetector.setIsLongpressEnabled(true);
        //获取屏幕的高度
        phone_high = getMetrics().heightPixels;


    }


    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //触摸返回值
        int action = event.getAction();
        float y = event.getY();
        switch (action) {
            //开始触摸
            case MotionEvent.ACTION_DOWN:
                //开始触摸时候返回的坐标
                //取消计时器
                myHanlder.removeCallbacks(run);
                break;
            //触摸移动
            case MotionEvent.ACTION_MOVE:
                //动态设定布局的高度为手势移动的高度
                if (event.getRawY() >= small_high) {
                    linearParams.height = (int) event.getRawY();
                    show.setLayoutParams(linearParams);
                }
                break;
            //终止触摸
            case MotionEvent.ACTION_UP:
                break;
        }

        return mGestureDetector.onTouchEvent(event);
    }

    //获取屏幕高度的方法
    private DisplayMetrics getMetrics() {
        WindowManager wm = getWindowManager();
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        return outMetrics;
    }


    //以下为手势监听,配合ontouch方法使用
    //滑动的距离和速率。为了判断手势
    final int FLING_MIN_DISTANCE = 10, FLING_MIN_VELOCITY = 100;

    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        return false;
    }


    @Override
    public void onLongPress(MotionEvent e) {

    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        //判断当滑动距离大于50并且速率大于200,即自动收回,向上滑动
        if (e1.getRawY() - e2.getRawY() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
            //停止的高度为50,就是抽屉的最后的停留位置
            stop_high = small_high;
            myHanlder.post(run);

            //判断当滑动距离小于50并且速率大于200,即自动展开,向下滑动
        } else if (e1.getRawY() - e2.getRawY() < -FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
            //停止的高度即屏幕高度,就是抽屉的最后的停留位置
            stop_high = phone_high;
            myHanlder.post(run);

        }
        return false;
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_400">

    <LinearLayout
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/wifi_bg"
        android:overScrollMode="never"
        android:scrollbars="none">

        <LinearLayout
            android:id="@+id/info"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <TextView

                android:visibility="gone"
                android:id="@+id/test1"
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_80"
                android:gravity="center"
                android:textColor="#ffffff"
                android:textSize="18sp" />

            <TextView
                android:visibility="gone"
                android:id="@+id/test2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/dp_170"
                android:gravity="center_horizontal"
                android:scaleType="fitXY"
                android:textColor="#ffffff"
                android:textSize="18sp" />

        </LinearLayout>
    </LinearLayout>


    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_60"
        android:layout_alignBottom="@+id/show"
        android:layout_alignParentStart="true"
        android:background="@color/transparent" />

</RelativeLayout>

图片

Android手势下拉抽屉效果_LinearLayout实现上下抽屉_03

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月12日 0

暂无评论

推荐阅读
ttOzQgS7km1w