Skip to content

Commit 26d7a9c

Browse files
committed
添加上半屏幕可伸缩控件,类似一个人的详情页可以收起的小Demo,没有处理手势冲突,自行处理。
1 parent 84a03eb commit 26d7a9c

12 files changed

Lines changed: 381 additions & 0 deletions

ViewDragHelper-Demo/app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
<activity android:name=".ViewDragHelperActivity"
2222
android:theme="@style/Theme.AppCompat.Light.NoActionBar"></activity>
23+
24+
<activity android:name=".WanDouJiaActivity"></activity>
2325
</application>
2426

2527
</manifest>

ViewDragHelper-Demo/app/src/main/java/com/yanbober/viewdraghelper_demo/MainActivity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
1010
private Button mVerticalDrawerLayoutBtn;
1111
private Button mViewDrawerHealperBtn;
12+
private Button mViewDrawerHealperBtn1;
1213

1314
@Override
1415
protected void onCreate(Bundle savedInstanceState) {
@@ -20,8 +21,10 @@ protected void onCreate(Bundle savedInstanceState) {
2021
private void init() {
2122
mVerticalDrawerLayoutBtn = (Button) findViewById(R.id.btn_1);
2223
mViewDrawerHealperBtn = (Button) findViewById(R.id.btn_2);
24+
mViewDrawerHealperBtn1 = (Button) findViewById(R.id.btn_3);
2325
mVerticalDrawerLayoutBtn.setOnClickListener(this);
2426
mViewDrawerHealperBtn.setOnClickListener(this);
27+
mViewDrawerHealperBtn1.setOnClickListener(this);
2528
}
2629

2730
@Override
@@ -32,5 +35,8 @@ public void onClick(View v) {
3235
else if (v == mViewDrawerHealperBtn) {
3336
startActivity(new Intent(MainActivity.this, ViewDragHelperActivity.class));
3437
}
38+
else if (v == mViewDrawerHealperBtn1) {
39+
startActivity(new Intent(MainActivity.this, WanDouJiaActivity.class));
40+
}
3541
}
3642
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.yanbober.viewdraghelper_demo;
2+
3+
import android.os.Bundle;
4+
import android.support.v4.app.Fragment;
5+
import android.support.v4.app.FragmentManager;
6+
import android.support.v4.app.FragmentStatePagerAdapter;
7+
8+
import java.util.ArrayList;
9+
10+
public class ThisViewPagerAdapter extends FragmentStatePagerAdapter {
11+
private ArrayList<String> mTitleList = new ArrayList<>();
12+
13+
public ThisViewPagerAdapter(FragmentManager fm) {
14+
super(fm);
15+
16+
mTitleList.add("列表统计");
17+
mTitleList.add("详情说明");
18+
mTitleList.add("其他杂项");
19+
}
20+
21+
@Override
22+
public Fragment getItem(int position) {
23+
Fragment fragment = new ViewPagerFragment();
24+
Bundle bundle = new Bundle();
25+
bundle.putInt(ViewPagerFragment.ARG_KEY, position);
26+
fragment.setArguments(bundle);
27+
return fragment;
28+
}
29+
30+
@Override
31+
public int getCount() {
32+
return 3;
33+
}
34+
35+
@Override
36+
public CharSequence getPageTitle(int position) {
37+
return mTitleList.get(position);
38+
}
39+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.yanbober.viewdraghelper_demo;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.view.LayoutInflater;
6+
import android.view.View;
7+
import android.view.ViewGroup;
8+
9+
public class ViewPagerFragment extends android.support.v4.app.Fragment {
10+
public static final String ARG_KEY = "cur_type";
11+
public static final int ARG_VALUE_0 = 0;
12+
public static final int ARG_VALUE_1 = 1;
13+
public static final int ARG_VALUE_2 = 2;
14+
15+
private int mType;
16+
private View mParentView;
17+
18+
@Override
19+
public void onCreate(Bundle savedInstanceState) {
20+
super.onCreate(savedInstanceState);
21+
mType = getArguments().getInt(ARG_KEY);
22+
}
23+
24+
@Nullable
25+
@Override
26+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
27+
int resourceId = -1;
28+
switch (mType) {
29+
case ARG_VALUE_0:
30+
resourceId = R.layout.fragment_view_pager_layout;
31+
break;
32+
case ARG_VALUE_1:
33+
resourceId = R.layout.fragment_view_pager1_layout;
34+
break;
35+
case ARG_VALUE_2:
36+
resourceId = R.layout.fragment_view_pager2_layout;
37+
break;
38+
default:
39+
resourceId = R.layout.fragment_view_pager_layout;
40+
break;
41+
}
42+
43+
mParentView = LayoutInflater.from(container.getContext()).inflate(resourceId, container, false);
44+
return mParentView;
45+
}
46+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.yanbober.viewdraghelper_demo;
2+
3+
import android.content.Context;
4+
import android.graphics.Color;
5+
import android.os.Bundle;
6+
import android.support.annotation.Nullable;
7+
import android.support.v4.view.PagerTabStrip;
8+
import android.support.v4.view.ViewPager;
9+
import android.support.v7.app.AppCompatActivity;
10+
import android.view.View;
11+
import android.widget.Button;
12+
import android.widget.Toast;
13+
14+
public class WanDouJiaActivity extends AppCompatActivity implements View.OnClickListener {
15+
private Context mContext;
16+
private Button mTopBtn;
17+
private ViewPager mViewPager;
18+
private PagerTabStrip mPagerTabStrip;
19+
20+
private ThisViewPagerAdapter mAdapter;
21+
22+
@Override
23+
protected void onCreate(@Nullable Bundle savedInstanceState) {
24+
super.onCreate(savedInstanceState);
25+
mContext = this;
26+
setContentView(R.layout.activity_wandoujia_layout);
27+
28+
init();
29+
}
30+
31+
private void init() {
32+
mTopBtn = (Button) findViewById(R.id.top_click_btn);
33+
mViewPager = (ViewPager) findViewById(R.id.viewpager);
34+
mPagerTabStrip = (PagerTabStrip) findViewById(R.id.pager_tab_strip_can_exchange);
35+
36+
mTopBtn.setOnClickListener(this);
37+
38+
mPagerTabStrip.setDrawFullUnderline(false);
39+
mPagerTabStrip.setTabIndicatorColor(Color.GREEN);
40+
// mPagerTabStrip.setTextSpacing(100);
41+
42+
mAdapter = new ThisViewPagerAdapter(getSupportFragmentManager());
43+
mViewPager.setAdapter(mAdapter);
44+
}
45+
46+
@Override
47+
public void onClick(View v) {
48+
if (v == mTopBtn) {
49+
Toast.makeText(getApplicationContext(), "上面测试按钮按下!", Toast.LENGTH_LONG).show();
50+
}
51+
}
52+
}
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package com.yanbober.viewdraghelper_demo.view;
2+
3+
import android.content.Context;
4+
import android.support.v4.view.ViewCompat;
5+
import android.support.v4.widget.ViewDragHelper;
6+
import android.util.AttributeSet;
7+
import android.view.MotionEvent;
8+
import android.view.View;
9+
import android.view.ViewConfiguration;
10+
import android.view.ViewGroup;
11+
import android.widget.LinearLayout;
12+
/**
13+
* 头部可伸缩ViewGroup
14+
*
15+
* 特别注意,这里result直接返回true,混合式使用时手势自己处理一下,这里主要介绍ViewDragHelper用法而已。
16+
*/
17+
public class WanDouJiaLayout extends LinearLayout {
18+
private static final String TAG = "WanDouJiaLayout";
19+
20+
private View mTopView;
21+
private View mBottomView;
22+
23+
private ViewDragHelper mHelper;
24+
25+
private int mBottomViewTop = 0;
26+
27+
private float mCurX, mCurY;
28+
29+
private boolean mIsFirst = true;
30+
31+
public WanDouJiaLayout(Context context) {
32+
this(context, null);
33+
}
34+
35+
public WanDouJiaLayout(Context context, AttributeSet attrs) {
36+
this(context, attrs, 0);
37+
}
38+
39+
public WanDouJiaLayout(Context context, AttributeSet attrs, int defStyleAttr) {
40+
super(context, attrs, defStyleAttr);
41+
initView();
42+
}
43+
44+
private void initView() {
45+
setOrientation(LinearLayout.VERTICAL);
46+
47+
mHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelperCallBack());
48+
}
49+
50+
@Override
51+
protected void onFinishInflate() {
52+
super.onFinishInflate();
53+
54+
if (getChildCount() != 2) {
55+
throw new RuntimeException("WanDouJiaLayout only need two View for child!");
56+
}
57+
58+
mTopView = getChildAt(0);
59+
mBottomView = getChildAt(1);
60+
}
61+
62+
@Override
63+
public boolean onInterceptTouchEvent(MotionEvent ev) {
64+
//关于与ListView等混合时手势这里不给出了,自己处理一下即可!!!!!!!!!!!
65+
//特别注意,这里result直接返回true,混合式使用时手势自己处理一下,这里主要介绍ViewDragHelper用法而已。
66+
boolean result = true;
67+
return mHelper.shouldInterceptTouchEvent(ev) & result;
68+
}
69+
70+
@Override
71+
public boolean onTouchEvent(MotionEvent event) {
72+
mHelper.processTouchEvent(event);
73+
return true;
74+
}
75+
76+
@Override
77+
public void computeScroll() {
78+
super.computeScroll();
79+
if (mHelper.continueSettling(true)) {
80+
ViewCompat.postInvalidateOnAnimation(this);
81+
}
82+
}
83+
84+
@Override
85+
protected void onLayout(boolean changed, int l, int t, int r, int b) {
86+
super.onLayout(changed, l, t, r, b);
87+
88+
if (mIsFirst) {
89+
mBottomViewTop = mBottomView.getTop();
90+
mIsFirst = false;
91+
}
92+
93+
int offset = mTopView.getHeight() - mBottomViewTop;
94+
mTopView.layout(mTopView.getLeft(), -offset,
95+
mTopView.getRight(), mBottomViewTop);
96+
97+
ViewGroup.LayoutParams params = mBottomView.getLayoutParams();
98+
params.height = params.height + offset;
99+
mBottomView.setLayoutParams(params);
100+
101+
mBottomView.layout(mBottomView.getLeft(), mBottomViewTop,
102+
mBottomView.getRight(), mBottomViewTop + mBottomView.getHeight());
103+
}
104+
105+
private class ViewDragHelperCallBack extends ViewDragHelper.Callback {
106+
@Override
107+
public boolean tryCaptureView(View child, int pointerId) {
108+
if (child == mTopView) {
109+
mHelper.captureChildView(mBottomView, pointerId);
110+
}
111+
return mBottomView == child;
112+
}
113+
114+
@Override
115+
public int clampViewPositionVertical(View child, int top, int dy) {
116+
//实时变化,最大挪动位置限制处理,如果想要回弹效果这个区域可以大一点
117+
return Math.min(Math.max(0, top), mTopView.getMeasuredHeight());
118+
}
119+
120+
@Override
121+
public int getViewVerticalDragRange(View child) {
122+
//灵敏度计算区域
123+
return getMeasuredHeight();
124+
}
125+
126+
@Override
127+
public void onViewReleased(View releasedChild, float xvel, float yvel) {
128+
int top = (yvel < 0 && mBottomViewTop < mTopView.getHeight()/2) ? 0 : mTopView.getMeasuredHeight();
129+
mHelper.settleCapturedViewAt(mBottomView.getLeft(), top);
130+
postInvalidate();
131+
}
132+
133+
@Override
134+
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
135+
super.onViewPositionChanged(changedView, left, top, dx, dy);
136+
mBottomViewTop = top;
137+
//重新进行绘制,因为这样就可以让上下两部分完全重新调运onLayout布局铺满屏幕
138+
requestLayout();
139+
}
140+
}
141+
}

ViewDragHelper-Demo/app/src/main/res/layout/activity_main.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,11 @@
2323
android:layout_height="wrap_content"
2424
android:id="@+id/btn_2"
2525
android:text="@string/btn_2_str"/>
26+
27+
<Button
28+
android:layout_marginTop="20dp"
29+
android:layout_width="match_parent"
30+
android:layout_height="wrap_content"
31+
android:id="@+id/btn_3"
32+
android:text="@string/btn_3_str"/>
2633
</LinearLayout>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<com.yanbober.viewdraghelper_demo.view.WanDouJiaLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="match_parent"
5+
android:background="@android:color/holo_blue_dark">
6+
7+
<LinearLayout
8+
android:layout_width="match_parent"
9+
android:orientation="vertical"
10+
android:layout_height="wrap_content"
11+
android:gravity="center"
12+
android:background="@android:color/holo_blue_dark">
13+
<TextView
14+
android:text="我是测试头部内容"
15+
android:textSize="28sp"
16+
android:layout_marginTop="20dp"
17+
android:layout_width="wrap_content"
18+
android:layout_height="wrap_content" />
19+
20+
<Button
21+
android:id="@+id/top_click_btn"
22+
android:text="测试焦点按钮"
23+
android:layout_margin="20dp"
24+
android:layout_width="match_parent"
25+
android:layout_height="wrap_content" />
26+
</LinearLayout>
27+
28+
<android.support.v4.view.ViewPager
29+
android:id="@+id/viewpager"
30+
android:layout_width="match_parent"
31+
android:layout_height="match_parent">
32+
33+
<android.support.v4.view.PagerTabStrip
34+
android:background="@android:color/holo_blue_dark"
35+
android:id="@+id/pager_tab_strip_can_exchange"
36+
android:layout_width="match_parent"
37+
android:layout_height="wrap_content"></android.support.v4.view.PagerTabStrip>
38+
39+
</android.support.v4.view.ViewPager>
40+
41+
</com.yanbober.viewdraghelper_demo.view.WanDouJiaLayout>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:orientation="vertical"
4+
android:layout_width="match_parent"
5+
android:layout_height="match_parent"
6+
android:fillViewport="true">
7+
8+
<LinearLayout
9+
android:background="@android:color/holo_green_dark"
10+
android:layout_width="match_parent"
11+
android:layout_height="match_parent">
12+
<TextView
13+
android:padding="20dp"
14+
android:textSize="20sp"
15+
android:layout_width="match_parent"
16+
android:layout_height="match_parent"
17+
android:text="@string/test_str"/>
18+
</LinearLayout>
19+
20+
</ScrollView>

0 commit comments

Comments
 (0)