package com.admin.baselibrary;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.AbsListView;
import android.widget.FrameLayout;
/**
* github:https://github.com/HomHomLin/SlidingLayout
* Created by Linhh on 16/4/12.
*/
public class SlidingLayout extends FrameLayout {
private int mTouchSlop;//系统允许最小的滑动判断值
private int mBackgroundViewLayoutId = 0;
private View mBackgroundView;//背景View
private View mTargetView;//正面View
private boolean mIsBeingDragged;
private float mInitialDownY;
private float mInitialMotionY;
private float mLastMotionY;
private int mActivePointerId = INVALID_POINTER;
private float mSlidingOffset = 0.5F;//滑动阻力系数
private static final int RESET_DURATION = 200;
private static final int SMOOTH_DURATION = 1000;
public static final int SLIDING_MODE_BOTH = 0;
public static final int SLIDING_MODE_TOP = 1;
public static final int SLIDING_MODE_BOTTOM = 2;
public static final int SLIDING_POINTER_MODE_ONE = 0;
public static final int SLIDING_POINTER_MODE_MORE = 1;
private int mSlidingMode = SLIDING_MODE_BOTH;
private int mSlidingPointerMode = SLIDING_POINTER_MODE_MORE;
private static final int INVALID_POINTER = -1;
private SlidingListener mSlidingListener;
public static final int STATE_SLIDING = 2;
public static final int STATE_IDLE = 1;
private int mSlidingTopMaxDistance = SLIDING_DISTANCE_UNDEFINED;
public static final int SLIDING_DISTANCE_UNDEFINED = -1;
private OnTouchListener mDelegateTouchListener;
public interface SlidingListener {
//不能操作繁重的任务在这里
public void onSlidingOffset(View view, float delta);
public void onSlidingStateChange(View view, int state);
public void onSlidingChangePointer(View view, int pointerId);
}
public SlidingLayout(Context context) {
this(context, null);
}
public SlidingLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SlidingLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SlidingLayout);
mBackgroundViewLayoutId = a.getResourceId(R.styleable.SlidingLayout_background_view, mBackgroundViewLayoutId);
mSlidingMode = a.getInteger(R.styleable.SlidingLayout_sliding_mode, SLIDING_MODE_BOTH);
mSlidingPointerMode = a.getInteger(R.styleable.SlidingLayout_sliding_pointer_mode, SLIDING_POINTER_MODE_MORE);
mSlidingTopMaxDistance = a.getDimensionPixelSize(R.styleable.SlidingLayout_top_max, SLIDING_DISTANCE_UNDEFINED);
a.recycle();
if (mBackgroundViewLayoutId != 0) {
View view = View.inflate(getContext(), mBackgroundViewLayoutId, null);
setBackgroundView(view);
}
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}
public void setBackgroundView(View view) {
if (mBackgroundView != null) {
this.removeView(mBackgroundView);
}
mBackgroundView = view;
this.addView(view, 0);
}
public View getBackgroundView() {
return this.mBackgroundView;
}
public void setSlidingDistance(int distance) {
this.mSlidingTopMaxDistance = distance;
}
public int setSlidingDistance() {
return this.mSlidingTopMaxDistance;
}
/**
* 获得滑动幅度
*
* @return
*/
public float getSlidingOffset() {
return this.mSlidingOffset;
}
/**
* 设置滑动幅度
*
* @param slidingOffset
*/
public void setSlidingOffset(float slidingOffset) {
this.mSlidingOffset = slidingOffset;
}
public void setSlidingListener(SlidingListener slidingListener) {
this.mSlidingListener = slidingListener;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
//实际上整个layout只能存在一个背景和一个前景才有用途
// if(getChildCount() > 2){
//
// }
if (getChildCount() == 0) {
return;
}
if (mTargetView == null) {
ensureTarget();
}
if (mTargetView == null) {
return;
}
}
private void ensureTarget() {
if (mTargetView == null) {
mTargetView = getChildAt(getChildCount() - 1);
}
}
public void setTargetView(View view) {
if (mTargetView != null) {
this.removeView(mTargetView);
}
mTargetView = view;
this.addView(view);
}
@Override
public void setOnTouchListener(OnTouchListener l) {
// super.setOnTouchListener(l);
mDelegateTouchListener = l;
}
public View getTargetView() {
return this.mTargetView;
}
public float getSlidingDistance() {
return getInstrument().getTranslationY(getTargetView());
}
public Instrument getInstrument() {
return Instrument.getInstance();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
ensureTarget();
final int action = MotionEventCompat.getActionMasked(ev);
//判断拦截
switch (action) {
case MotionEvent.ACTION_DOWN:
// Log.i("onInterceptTouchEvent", "down");
mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
mIsBeingDragged = false;
final float initialDownY = getMotionEventY(ev, mActivePointerId);
if (initialDownY == -1) {
return false;
}
mInitialDownY = initialDownY;
break;
case MotionEvent.ACTION_MOVE:
if (mActivePointerId == INVALID_POINTER) {
// Log.e(LOG_TAG, "Got ACTION_MOVE event but don't have an active pointer id.");
return false;
}
final float y = getMotionEventY(ev, mActivePointerId);
if (y == -1) {
return false;
}
if (y > mInitialDownY) {
//判断是否是上拉操作
final float yDiff = y - mInitialDownY;
if (yDiff > mTouchSlop && !mIsBeingDragged && !canChildScrollUp()) {
mInitialMotionY = mInitialDownY + mTouchSlop;
mLastMotionY = mInitialMotionY;
mIsBeingDragged = true;
}
} else if (y < mInitialDownY) {
//判断是否是下拉操作
final float yDiff = mInitialDownY - y;
if (yDiff > mTouchSlop && !mIsBeingDragged && !canChildScrollDown()) {
mInitialMotionY = mInitialDownY + mTouchSlop;
mLastMotionY = mInitialMotionY;
mIsBeingDragged = true;
}
}
break;
case MotionEventCompat.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
// Log.i("onInterceptTouchEvent", "up");
mIsBeingDragged = false;
mActiv
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
感谢作者HomhomLin分享,支持原创请访问GitHub:https://github.com/HomHomLin/SlidingLayout。 SlidingLayout是一种Android平台的View控件,可以帮助你实现类似微信网页浏览的下拉功能,也可以帮助你实现类似iOS中UITableView的下拉上拉弹跳的果冻效果。 SlidingLayout完美兼容Android自带库和兼容库的所有View组件,包括RecyclerView、ListView、ScrollView以及WebView等等。 SlidingLayout简单易用,最低支持Android api v9。
资源推荐
资源详情
资源评论
收起资源包目录
SlidingLayout-master.rar (81个子文件)
TestApplication
gradlew.bat 2KB
gradlew 5KB
gradle.properties 747B
.gradle
2.14.1
tasks
_app_compileDebugJavaWithJavac
localJarClasspathSnapshot
localJarClasspathSnapshot.bin 19KB
localJarClasspathSnapshot.lock 17B
localClassSetAnalysis
localClassSetAnalysis.lock 17B
localClassSetAnalysis.bin 27KB
_baselibrary_compileReleaseJavaWithJavac
localJarClasspathSnapshot
localJarClasspathSnapshot.bin 19KB
localJarClasspathSnapshot.lock 17B
localClassSetAnalysis
localClassSetAnalysis.lock 17B
localClassSetAnalysis.bin 22KB
taskArtifacts
fileHashes.bin 501KB
cache.properties.lock 17B
taskArtifacts.bin 176KB
fileSnapshotsToTreeSnapshotsIndex.bin 60KB
fileSnapshots.bin 5.79MB
cache.properties 37B
app
proguard-rules.pro 662B
src
test
java
com
admin
testapplication
ExampleUnitTest.java 419B
androidTest
java
com
admin
testapplication
ExampleInstrumentedTest.java 780B
main
res
mipmap-xxxhdpi
ic_launcher.png 10KB
drawable
mipmap-hdpi
ic_launcher.png 3KB
values
colors.xml 208B
strings.xml 76B
styles.xml 383B
dimens.xml 211B
mipmap-xxhdpi
ic_launcher.png 8KB
mipmap-mdpi
ic_launcher.png 2KB
mipmap-xhdpi
ic_launcher.png 5KB
layout
list_item.xml 506B
activity_recycler_view.xml 786B
activity_main.xml 2KB
activity_list_view.xml 785B
view_bg.xml 901B
activity_web_view.xml 753B
white_bg.xml 274B
view_front.xml 298B
values-w820dp
dimens.xml 364B
java
com
admin
testapplication
RecyclerViewActivity.java 2KB
ListViewActivity.java 3KB
MainActivity.java 1KB
WebViewActivity.java 518B
AndroidManifest.xml 913B
app.iml 10KB
.gitignore 8B
build.gradle 799B
libs
gradle
wrapper
gradle-wrapper.jar 52KB
gradle-wrapper.properties 233B
TestApplication.iml 869B
.idea
gradle.xml 779B
runConfigurations.xml 564B
misc.xml 2KB
copyright
profiles_settings.xml 76B
modules.xml 496B
compiler.xml 686B
workspace.xml 224KB
libraries
appcompat_v7_23_3_0.xml 1KB
library_2_4_0.xml 520B
support_vector_drawable_23_3_0.xml 807B
support_annotations_23_3_0.xml 495B
recyclerview_v7_23_3_0.xml 779B
hamcrest_core_1_3.xml 526B
junit_4_12.xml 477B
support_v4_23_3_0.xml 1KB
animated_vector_drawable_23_3_0.xml 814B
baselibrary
proguard-rules.pro 662B
src
test
java
com
admin
baselibrary
ExampleUnitTest.java 415B
androidTest
java
com
admin
baselibrary
ExampleInstrumentedTest.java 772B
main
res
values
attrs.xml 589B
java
com
admin
baselibrary
SlidingLayout.java 16KB
Instrument.java 2KB
AndroidManifest.xml 281B
baselibrary.iml 10KB
.gitignore 8B
build.gradle 740B
libs
.gitignore 127B
local.properties 427B
settings.gradle 32B
build
intermediates
dex-cache
cache.xml 9KB
generated
mockable-android-23.jar 22.2MB
build.gradle 672B
共 81 条
- 1
资源评论
hbw020
- 粉丝: 35
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功