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
分享到:
相关推荐
DragLayout java代码
NULL 博文链接:https://gundumw100.iteye.com/blog/2251284
Android DragLayout仿QQ侧滑效果使用support.v4包下的ViewDragHelper实现QQ5.0侧滑效果。
博客中需要的所有代码,仅供参考
目前比较好用的一个侧滑功能,和QQ那样的侧滑有点相似,在这里分享给大家。
DragLayout仿QQ侧滑效果.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
侧滑的实现方式有很多方式来实现,这次总结的ViewDragHelper就是其中一种方式,ViewDragHelper是2013年谷歌I/O大会发布的新的控件,为了解决界面控件拖拽问题。下面就是自己学习写的一个实现类似于QQ侧滑效果的...
DragLayout使用support.v4包下的ViewDragHelper实现QQ5.0侧滑##Screenshots
NULL 博文链接:https://gundumw100.iteye.com/blog/2249642
DragLayout_youtobe##模仿实youtobe视频拖动放大缩小
今天学习的新内容是侧滑导航栏,我想大家肯定都比较熟悉了,...下面就是粘贴我代码的时间了。 activity_main.xml <cn.edu.rjxy.activity.DragLayout xmlns:android=http://schemas.android.com/apk/res/android x
#先看效果图##仿QQ5.0的侧滑菜单##简单的侧滑效果##带缩放效果的侧滑菜单#使用步骤##只需完成下面三步,就能使用这个自定义的侧滑菜单控件##1 导包将dragLayout.jar包导入到你的项目中。##2,布局文件布局中使用这个...
在实现这个的功能的过程中,也走了一点弯路,我们内部1.0版本的时候,使用的是sortablejs,由于代码写的比较混乱,拖拽功能经常出现卡死的现象,以为是sortablejs的问题,然后又换成大名鼎鼎的React Dnd,和Redux是...
核心代码在src/drag_layout/index.js。 演示 下载后项目启动 # install dependencies npm install # Start the service npm run start # build for development npm run dev # build for production npm run umd ...
android-drag-FowLayoutthis is a draggable flow layout lib (android 可拖拽的流布局库) . support android-x特点1, 类似可拖拽的GridView. 不过gridView 宽度/个数是固定的。 这个布局item宽度是不定的(放不下...
本程序现阶段主要是简单的获取中国各省份城市并保存到数据库,通过listview的形式显示城市列表,数据库的存取主要是用到了ORM映射,省去了繁琐的建表操作和数据库处理操作。...代码笨拙,请勿见怪。
本架构主要实现侧滑出现底部view和首页实现tabhost效果,并且每一个fragment支持使用多个 ...本项目主要底部TabFragment和左边侧滑DragLayout 以及CustomViewPager 实现,并且提供退出应用的一种关闭所有acitiviy的方式
android市面主流侧滑框架,本架构主要实现侧滑出现底部view和首页实现tabhost效果,并且...本项目主要底部TabFragment和左边侧滑DragLayout 以及CustomViewPager 实现,并且提供退出应用的一种关闭所有acitiviy的方式。
一个在ViewPager头部添加一个可以下拉的头部用以显示说明信息,类型豌豆荚的应用详情页实现。... android:layout_width="match_parent" android:layout_height="match_parent"> ... }).setup(dragLayout);
而下面的 View是一个可以滑动拖动效果的View,可以采用网上一个叫做DragLayout的控件,我这里是自己实现了一个,主要是通过对View的事件分发的一些处理;然后滑动到下面就是一个图文详情的View(Fragm