`

DragLayout测试代码(ViewDragHelper)

阅读更多
DragLayout显示在屏幕三分之二的地方,往下拖,即可显示背后的View



import android.content.Context;
import android.graphics.Rect;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.view.*;
import android.widget.FrameLayout;

import com.hide.transitionstest.app.R;

public class DragLayout extends FrameLayout {

    public static final int STATE_COLLAPSE = 1;
    public static final int STATE_EXPAND = 2;

    private ViewGroup mDragContent;
    private View mTouchView;


    private IDragListener iDragListener;
    private ViewDragHelper mDragHelper;
    private int mSlideMaxY;
    private int mTopPadding;
    private int mCurState = STATE_EXPAND;


    private ViewDragHelper.Callback mCallback = new ViewDragHelper.Callback() {
        @Override
        public boolean tryCaptureView(View child, int pointerId) {
            return child == mDragContent;
        }

        @Override
        public int clampViewPositionVertical(View child, int top, int dy) {
            return clampHeight(top);
        }

        @Override
        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
            if (iDragListener != null) {
                iDragListener.onDragChange(dragPercent(top));
            }
        }

        @Override
        public int getViewVerticalDragRange(View child) {
            return mSlideMaxY;
        }

        @Override
        public void onViewReleased(View releasedChild, float xvel, float yvel) {
            super.onViewReleased(releasedChild, xvel, yvel);

            int settleTop = mTopPadding;
            int slideRange = releasedChild.getTop() - mTopPadding;
            switch (mCurState) {
                case STATE_EXPAND:
                    if (yvel >= 0
                            && slideRange > mSlideMaxY / 5) {
                        settleTop = getHeight() - mTouchView.getMeasuredHeight();
                    }
                    break;
                case STATE_COLLAPSE:
                    slideRange = getHeight() - releasedChild.getTop() - mTouchView.getMeasuredHeight();
                    if (yvel > 0
                            || slideRange < mSlideMaxY / 5) {
                        settleTop = getHeight() - mTouchView.getMeasuredHeight();
                    }
                    break;
            }

            mDragHelper.settleCapturedViewAt(getLeft(), settleTop);
            invalidate();
        }

        @Override
        public void onViewDragStateChanged(int state) {
            super.onViewDragStateChanged(state);
            switch (state) {
                case ViewDragHelper.STATE_IDLE:
                    mCurState = mTopPadding == mDragContent.getTop() ? STATE_EXPAND : STATE_COLLAPSE;
                    break;
            }
        }
    };


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

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

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

    private void init() {
        removeAllViews();
        mDragContent = (ViewGroup) LayoutInflater.from(getContext()).inflate(R.layout.drag_layout, null);
        mTouchView = mDragContent.findViewById(R.id.drag);
        addView(mDragContent);
        getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                getViewTreeObserver().removeOnPreDrawListener(this);

                int height = getContext().getResources().getDisplayMetrics().heightPixels * 2 / 3;
                ViewGroup.LayoutParams params = mDragContent.getLayoutParams();
                params.height = height;
                mDragContent.setLayoutParams(params);

                mSlideMaxY = height - mTouchView.getMeasuredHeight();

                return false;
            }
        });

        mDragHelper = ViewDragHelper.create(this, 1.0f, mCallback);
//        ViewGroupCompat.setMotionEventSplittingEnabled(this, false);
    }


    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        boolean intercept;
        try {
            intercept = mDragHelper.shouldInterceptTouchEvent(ev);
        } catch (Exception e) {
            e.printStackTrace();
            intercept = false;
        }
        return intercept;
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        int height = getContext().getResources().getDisplayMetrics().heightPixels;
        int childHeight = height * 2 / 3;
        Rect statusBarRect = new Rect();
        getWindowVisibleDisplayFrame(statusBarRect);
        int statusBar = statusBarRect.top;
        height -= statusBar;
        mTopPadding = height - childHeight;
        mDragContent.layout(left, top + mTopPadding, right, bottom);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        boolean onTouch = true;
        try {
            mDragHelper.processTouchEvent(event);
        } catch (Exception e) {
            e.printStackTrace();
            onTouch = false;
        }
        return onTouch;
    }

    private int clampHeight(int top) {
        return Math.max(mTopPadding, Math.min(top, mSlideMaxY + mTopPadding));
    }

    private float dragPercent(int top) {
        return 1 - (top - mTopPadding) * 1.0f / mSlideMaxY;

    }


    @Override
    public void computeScroll() {
        super.computeScroll();
        if (mDragHelper.continueSettling(true)) {
            ViewCompat.postInvalidateOnAnimation(this);
        }
    }

    public void setOnDragListener(IDragListener l) {
        iDragListener = l;
    }

    public interface IDragListener {
        void onDragChange(float fraction);
    }
}



drag_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drag_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FAFAFA"
    android:orientation="vertical">

    <TextView
        android:id="@+id/drag"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#000"
        android:gravity="center"
        android:text="拖 拽 这 里"
        android:textColor="#fff"
        android:textSize="16sp" />

    <ScrollView
        android:id="@+id/drag_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal"
            android:text="1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n15\n15\n15\n15\n15\n15\n15\n15\n15\n15\n15\n15\n"
            android:textSize="16sp" />
    </ScrollView>

</LinearLayout>



用法:

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.transitions.everywhere.TransitionManager;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import android.widget.ImageView;

import com.hide.transitionplayer.lib.TransitionPlayer;
import com.hide.transitionstest.app.widget.DragLayout;

/**
 * * * * * * * * * * * * * * * * * * * * * * *
 * Created by zhaoyiding
 * Date: 15/10/12
 * * * * * * * * * * * * * * * * * * * * * * *
 **/
public class DragTransitionActivity extends Activity
        implements DragLayout.IDragListener {

    private View mDimView;
    private ViewGroup mSceneRoot;
    private TransitionPlayer mTransitionPlayer = new TransitionPlayer();
    private ImageView mHeadImg;

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

//        mDimView = findViewById(R.id.dimView);
//        mSceneRoot = (ViewGroup) findViewById(R.id.scene_root);
//        mHeadImg = (ImageView) findViewById(R.id.headimg);
//
//        initImg();

        final DragLayout mDragLayout = (DragLayout) findViewById(R.id.drag_layout);
        mDragLayout.setOnDragListener(this);
//        mDragLayout.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
//            @Override
//            public boolean onPreDraw() {
//                mDragLayout.getViewTreeObserver().removeOnPreDrawListener(this);
//                TransitionManager.beginDelayedTransition(mSceneRoot, mTransitionPlayer);
//                ViewGroup.MarginLayoutParams marginParams = (ViewGroup.MarginLayoutParams) mHeadImg.getLayoutParams();
//                marginParams.topMargin = 0;
//                mHeadImg.setLayoutParams(marginParams);
//                mHeadImg.setAlpha(1.0f);
//
//                mHeadImg.post(new Runnable() {
//                    @Override
//                    public void run() {
//                        mTransitionPlayer.setCurrentFraction(1.0f);
//
//                    }
//                });
//                return false;
//            }
//        });

    }

//    private void initImg() {
//        int height = getResources().getDisplayMetrics().heightPixels / 3 - IndexActivity.sStatusBarHeight;
//        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height);
//        params.topMargin = -height * 2 / 3;
//        mHeadImg.setLayoutParams(params);
//        mHeadImg.setAlpha(0f);
//    }
//
//    private void setDimViewAlpha(float fraction) {
//        mDimView.setBackgroundColor(Color.argb((int) (255 * fraction), 0, 0, 0));
//        mTransitionPlayer.setCurrentFraction(fraction);
//    }

    @Override
    public void onDragChange(float fraction) {
//        setDimViewAlpha(fraction);
    }
}


布局activity_drag_transition.xml:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!--
    <View
        android:id="@+id/dimView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000" />

    <FrameLayout
        android:id="@+id/scene_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/headimg"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="#f8f8f8"
            android:scaleType="centerInside"
            android:src="@mipmap/google_logo" />
    </FrameLayout>
    -->
    <com.hide.transitionstest.app.widget.DragLayout
        android:id="@+id/drag_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</merge>



仿豌豆荚ViewPager下拉:DragTopLayout
http://www.open-open.com/lib/view/open1422430262923.html
  • 大小: 365.3 KB
分享到:
评论

相关推荐

    使用ViewDragHelper实现的DragLayout开门效果

    在提供的TestViewDragHelper文件中,可能包含了实现这一效果的示例代码,包括DragLayout的定义、触摸事件处理以及ViewDragHelper的回调方法。通过分析和学习这些代码,开发者可以更深入地理解如何利用ViewDragHelper...

    Android DragLayout仿QQ侧滑效果.zip

    本项目“Android DragLayout仿QQ侧滑效果”旨在帮助开发者理解和实现类似QQ的侧滑功能,主要依赖于Android Support Library中的`ViewDragHelper`组件。 `ViewDragHelper`是Android SDK提供的一种工具类,它为开发者...

    侧滑菜单DragLayout(tianfuxiaoyan)

    在代码实现上,DragLayout可能包括以下几个关键部分: 1. **触摸事件处理**:DragLayout需要监听MotionEvent,识别用户的滑动操作。通常,它会使用onTouchEvent()方法来捕获这些事件。在事件处理中,需要判断滑动的...

    DragLayout

    DragLayout是一种自定义布局,主要用于实现Android应用中的拖动效果,比如常见的抽屉式菜单、滑动删除等交互。在Android开发中,DragLayout通常由开发者根据实际需求自定义实现,它扩展了Android的ViewGroup类,从而...

    使用support.v4包下的ViewDragHelper实现QQ5.0侧滑

    7. **运行与测试**:最后,将你的代码集成到项目中,运行在真机或模拟器上进行测试。由于示例中提到最好在真机上运行,因为可能涉及到本地图片的加载,真机测试能更准确地反映出实际效果。 通过以上步骤,你就可以...

    DragLayout侧滑

    为了更好地理解并复用这个功能,我们需要查看和分析源代码,特别是`DragLayout.java`和对应的XML布局文件。 总之,"DragLayout侧滑"是Android开发中的一个重要组件,它需要开发者具备扎实的触摸事件处理和自定义...

    Android ViewDragHelper 实现 QQ5.0 侧滑(转)

    在`DragLayout`的构造函数中,初始化`ViewDragHelper`的实例,并设置其回调。 在`DragLayout`的回调方法中,我们需要覆盖`onTouchEvent()`以处理触摸事件。当用户触摸屏幕并开始拖动时,`ViewDragHelper`会调用`...

    ViewDragHelper实现QQ侧滑效果

     侧滑的实现方式有很多方式来实现,这次总结的ViewDragHelper就是其中一种方式,ViewDragHelper是2013年谷歌I/O大会发布的新的控件,为了解决界面控件拖拽问题。下面就是自己学习写的一个实现类似于QQ侧滑效果的...

    Android使用ViewDragHelper实现QQ6.X最新版本侧滑界面效果实例代码

    【Android使用ViewDragHelper实现QQ6.X侧滑界面效果实例代码】 在Android开发中,创建类似QQ6.X版本的侧滑界面效果是一项常见的需求。为了实现这一效果,开发者通常会利用`ViewDragHelper`这个强大的工具。`...

    安卓QQ相关相关-DragLayout仿QQ侧滑效果.zip

    本压缩包"DragLayout仿QQ侧滑效果.zip"包含了一个基于Java编写的Android项目,名为"DragLayout-master",旨在帮助开发者了解并实现类似的侧滑菜单。下面将详细介绍其中涉及的关键技术和知识点。 1. **DragLayout**...

    向上拖动时,可以惯性滑动显示到下一页的控件DragLayout

    对于“源码”,这意味着开发者可以查看并学习DragLayout的内部工作原理,甚至可以根据需求修改源代码以适应自己的项目。而“工具”则暗示DragLayout可能是一个可以被添加到开发工具箱中的组件,方便快速构建具有滑动...

    DragLayout-master:QQ5.0侧滑

    【标题】"DragLayout-master:QQ5.0侧滑"是一个Android开发项目,它使用了`support.v4`包中的`ViewDragHelper`组件来实现类似QQ5.0版本的侧滑效果。这个功能通常用于应用主界面的侧边菜单,用户可以通过在屏幕边缘...

    Android侧滑导航栏的实例代码

    下面将详细介绍如何创建一个简单的Android侧滑导航栏实例,并结合给定的代码进行解析。 首先,`DragLayout`看起来是自定义的布局,可能继承自`DrawerLayout`,在`activity_main.xml`中作为根布局。`DragLayout`包含...

    DragLayout_youtobe

    【DragLayout_youtobe】项目是一个基于Java编程语言实现的仿YouTube视频拖动放大缩小功能的布局组件。这个项目的主要目标是提供一个用户界面交互体验,允许用户通过拖动视频来实现播放区域的放大和缩小,类似于...

    安卓SlidingMenu各种菜单侧滑菜单相关-侧滑效果.zip

    9. **DragLayout-master**:DragLayout可能是一个用于实现滑动效果的自定义布局,它可以作为SlidingMenu的一个补充,提供更灵活的拖动交互。 总结来说,这个压缩包是一个学习和实践Android SlidingMenu侧滑菜单的...

    DragLayout-SlidingMenu:仿QQ5.0新特性-侧滑菜单-自定义侧滑面板控件

    #先看效果图##仿QQ5.0的侧滑菜单##简单的侧滑效果##带缩放效果的侧滑菜单#使用步骤##只需完成下面三步,就能使用这个自定义的侧滑菜单控件##1 导包将dragLayout.jar包导入到你的项目中。##2,布局文件布局中使用这个...

    qq4.0UI拖拽效果源码

    QQ4.0 UI拖拽效果源码是一种在Android平台上实现类似QQ4.0版本界面中的元素拖动功能的代码实现。这种效果通常用于创建可交互的用户界面,增强用户体验,让用户能够通过手势直接操作界面元素,例如拖动对话框、菜单...

    DragLayout:使用react 和 sortablejs 实现的页面拖拽Demo

    在实现这个的功能的过程中,也走了一点弯路,我们内部1.0版本的时候,使用的是sortablejs,由于代码写的比较混乱,拖拽功能经常出现卡死的现象,以为是sortablejs的问题,然后又换成大名鼎鼎的React Dnd,和Redux是...

Global site tag (gtag.js) - Google Analytics