Skip to content

Commit e0deb6b

Browse files
committed
2 parents af35c18 + 364b6e9 commit e0deb6b

8 files changed

Lines changed: 148 additions & 213 deletions

File tree

README.md

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,23 @@
11
# StackViewLayout
2-
**An swip StackViewLayout,support left and right.**
2+
**A swipe ViewGroup that supports left and right slide.**
33

4-
**层叠随手势滑动,带轮播自定义ViewGroup**
4+
**层叠View支持手势左右滑动,自动轮播,过渡动画**
5+
6+
1.onMeasure通过StackAdapter适配器取到itemView加入到StackLayaout容器
7+
8+
onMeasure() through stackAdapter add view to StackLayout
9+
10+
2.onLayout取到childView按照层叠布局
11+
12+
onLayout() get child view layout stack ui
13+
14+
3.onInterceptTouchEvent处理手势支持子View及Velocity
15+
16+
onInterceptTouchEvent() support child view gesture
17+
18+
4.onTouchEvent处理手势,释放后播放动画平滑过渡
19+
20+
onTouchEvent() swipe animation,when release recover animation
521

622
### Captures
723

@@ -13,19 +29,19 @@
1329
<li>注释:此图解释参数意义,展示效果不太精确,图片真实宽度为**上层橙色**
1430

1531
### Use
16-
implementation 'com.uis:stacklayout:0.3.1'
32+
implementation 'com.uis:stacklayout:0.3.4'
1733

1834
*Name*| *Descript*|*Value*
1935
-----|--------|---
20-
stackSpace|间距|默认值:10dp
21-
stackEdge|边界距离|默认值:10dp
22-
stackZoomX|x方向缩放| 0<x<=1,1表示等间距,默认值:1
23-
stackPadX|x方向偏移|表示偏移间距,默认值:0
36+
stackSpace|间距(space)|默认值(default):10dp
37+
stackEdge|边界距离(edge)|默认值(default):10dp
38+
stackZoomX|x方向缩放(x zoom)| 0<x<=1,1表示等间距,默认值(default):1
39+
stackPadX|x方向偏移(x padding)|表示偏移间距,默认值:0
2440
stackPadX|PadX*(Size-1) < Space|PadX优先级高于ZoomX
25-
stackZoomY|y方向缩放| 0<y<=1,1表示和顶层等高度,默认值:0.9
26-
stackLooper|自动轮播|false/true
27-
stackSize|层叠数量|3
28-
stackEdgeModel|层叠位置|left/right
41+
stackZoomY|y方向缩放(y zoom)| 0<y<=1,1表示和顶层等高度,默认值:0.9
42+
stackLooper|自动轮播(looper)|false/true
43+
stackSize|层叠数量(stack size)|3
44+
stackEdgeModel|层叠位置(stack model)|left/right
2945

3046
```
3147
<?xml version="1.0" encoding="utf-8"?>
@@ -86,15 +102,18 @@ stackEdgeModel|层叠位置|left/right
86102
### Version
87103
*Version*| *Descript*|*Fixed*
88104
----|----|----
89-
0.0.1|自动轮播,滑动从顶部移除,整体上浮|初始版本
90-
0.0.2|滑动从顶层加入,整体下沉|fixed 内部view点击事件
91-
0.1.0|zoomX,zoomY呈等比数列|更改属性
92-
0.1.1|只有一条数据时|fixed
93-
0.1.2|增加动画、轮播时间设置,获取当前选中位置|新增方法
94-
0.2.0|只有一个元素,不支持轮播和滑动|新增功能
95-
0.2.1|减少child层级,见child.measure()|新增功能
96-
0.3.0|增加联动效果(缩放+平移)|新增功能
97-
0.3.1|联动动画平滑过度|fixed
105+
0.0.1|自动轮播,滑动从顶部移除,整体上浮|support auto looper and animation
106+
0.0.2|滑动从顶层加入,整体下沉|fixed child view clicked event
107+
0.1.0|zoomX,zoomY呈等比数列|modify attribute
108+
0.1.1|只有一条数据时|fixed adapter itemSize=1
109+
0.1.2|增加动画、轮播时间设置,获取当前选中位置|add animation,looper time
110+
0.2.0|只有一个元素,不支持轮播和滑动|only one child,can't swipe
111+
0.2.1|减少child层级,见child.measure()|child.measure() opt
112+
0.3.0|增加联动效果(缩放+平移)|support whole animation
113+
0.3.1|联动动画平滑过度|fixed animation smooth
114+
0.3.2|联动动画去抖动及adapter数据更新会多出层|opt animation shake
115+
0.3.3|adapter数据更新ui展示错误|opt adapter changed display
116+
0.3.4|滑动促发item点击事件|fixed item clicked event
98117

99118
### License
100119

demo/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ dependencies {
2929
implementation 'com.makeramen:roundedimageview:2.3.0'
3030
implementation 'com.google.code.gson:gson:2.8.5'
3131
implementation "androidx.viewpager:viewpager:${androidx}"
32-
implementation 'com.facebook.fresco:fresco:1.11.0'
32+
implementation 'com.facebook.fresco:fresco:2.0.0'
33+
implementation 'com.huxq17.xrefreshview:xrefreshview:3.6.9'
3334
implementation project(':stacklayout')
3435
}
Lines changed: 21 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,26 @@
11
package com.uis.stackview.demo.activity;
22

3-
import android.content.Intent;
43
import android.graphics.Color;
5-
import android.net.Uri;
64
import android.os.Build;
75
import android.os.Bundle;
8-
import android.util.Log;
9-
import android.view.LayoutInflater;
106
import android.view.View;
117
import android.view.ViewGroup;
12-
import android.view.Window;
138
import android.view.WindowManager;
14-
import android.widget.Toast;
159

10+
import com.andview.refreshview.XRefreshView;
11+
import com.andview.refreshview.utils.LogUtils;
1612
import com.facebook.common.logging.FLog;
17-
import com.facebook.common.logging.LoggingDelegate;
1813
import com.facebook.drawee.backends.pipeline.Fresco;
19-
import com.facebook.drawee.interfaces.DraweeController;
20-
import com.facebook.drawee.view.SimpleDraweeView;
2114
import com.facebook.imagepipeline.core.ImagePipelineConfig;
22-
import com.google.gson.Gson;
23-
import com.uis.stackview.StackLayout;
2415
import com.uis.stackview.demo.R;
2516
import com.uis.stackview.demo.entity.ItemEntity;
2617
import java.util.List;
27-
2818
import androidx.appcompat.app.AppCompatActivity;
2919
import androidx.recyclerview.widget.LinearLayoutManager;
3020
import androidx.recyclerview.widget.RecyclerView;
31-
import android.view.WindowManager;
3221
import androidx.viewpager.widget.ViewPager;
3322

34-
/**
35-
* Created by xmuSistone on 2017/5/12.
36-
*/
37-
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
38-
39-
private RecyclerView recyclerView;
40-
private StackLayout stackViewLayout;
41-
List<ItemEntity> dataList;
23+
public class MainActivity extends AppCompatActivity{
4224

4325
@Override
4426
protected void onCreate(Bundle savedInstanceState) {
@@ -54,101 +36,45 @@ protected void onCreate(Bundle savedInstanceState) {
5436
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
5537
}
5638
}
57-
5839
super.onCreate(savedInstanceState);
5940
setContentView(R.layout.activity_main);
6041
if(Build.VERSION.SDK_INT >= 19){
6142
ViewGroup.LayoutParams params = findViewById(R.id.view).getLayoutParams();
6243
params.height = getResources().getDimensionPixelSize(R.dimen.status_height);
6344
}
6445
FLog.setMinimumLoggingLevel(FLog.VERBOSE);
46+
LogUtils.enableLog(false);
6547
if(!Fresco.hasBeenInitialized()) {
6648
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(getApplicationContext())
6749
.setDiskCacheEnabled(true)
6850
.setDownsampleEnabled(true)
6951
.build();
7052
Fresco.initialize(getApplicationContext(), config);
7153
}
72-
recyclerView = findViewById(R.id.recyclerView);
73-
stackViewLayout = findViewById(R.id.stacklayout);
74-
findViewById(R.id.bt_web).setOnClickListener(this);
75-
findViewById(R.id.bt_app).setOnClickListener(this);
76-
77-
dataList = StackAdapter.initDataList(this);
78-
ViewPager viewPager = findViewById(R.id.viewPager);
79-
ViewPagerAdapter adapter = new ViewPagerAdapter(dataList);
80-
viewPager.setAdapter(adapter);
81-
viewPager.setCurrentItem(adapter.getRealSize());
82-
83-
recyclerView.setLayoutManager(new LinearLayoutManager(this));
84-
recyclerView.setAdapter(new StackAdapter());
85-
//stackViewLayout.setStackLooper(true);
86-
//stackViewLayout.setPosition(10);
87-
stackViewLayout.setAdapter(new StackLayout.StackAdapter() {
88-
@Override
89-
public View onCreateView(ViewGroup parent) {
90-
return LayoutInflater.from(parent.getContext()).inflate(R.layout.item_fresco_layout,null);
91-
}
92-
93-
@Override
94-
public void onBindView(View view, int position) {
95-
SimpleDraweeView dv = view.findViewById(R.id.imageView);
96-
DraweeController controller = Fresco.newDraweeControllerBuilder()
97-
.setUri(Uri.parse(dataList.get(position).getMapImageUrl()))
98-
.setTapToRetryEnabled(true)
99-
.setOldController(dv.getController())
100-
.build();
101-
dv.setController(controller);
102-
}
10354

104-
@Override
105-
public int getItemCount() {
106-
return 5;//dataList.size();
107-
}
108-
109-
@Override
110-
public void onItemDisplay(int position) {
111-
Log.e("xx","display = " + position);
112-
}
55+
final List<ItemEntity> dataList = StackAdapter.initDataList(this);
56+
final StackAdapter stackAdapter = new StackAdapter();
57+
final RecyclerView recyclerView = findViewById(R.id.recyclerView);
58+
final XRefreshView freshView = findViewById(R.id.refreshView);
11359

60+
freshView.setAutoLoadMore(false);
61+
freshView.setSilenceLoadMore(false);
62+
freshView.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener(){
11463
@Override
115-
public void onItemClicked(int position) {
116-
Log.e("xx","clicked = " + position);
117-
//stackViewLayout.setStackLooper(false);
118-
//stackViewLayout.setPosition(position+3);
64+
public void onRefresh(boolean isPullDown) {
65+
freshView.stopRefresh();
66+
stackAdapter.dataList = dataList.subList(0,6);
67+
stackAdapter.notifyDataSetChanged();
11968
}
12069
});
121-
}
12270

123-
@Override
124-
public void onClick(View v) {
125-
switch (v.getId()){
126-
case R.id.bt_app:
127-
updateApp();
128-
break;
129-
case R.id.bt_web:
130-
updateWeb();
131-
break;
132-
default:
133-
}
134-
}
13571

136-
void updateWeb(){//"http://app.qq.com/#id=detail&appid=1104844480");//
137-
Uri uri = Uri.parse(String.format("http://a.app.qq.com/o/simple.jsp?pkgname=%s","cn.com.bailian.bailianmobile"));
138-
Intent it = new Intent(Intent.ACTION_VIEW, uri);
139-
startActivity(it);
140-
}
72+
ViewPager viewPager = findViewById(R.id.viewPager);
73+
ViewPagerAdapter adapter = new ViewPagerAdapter(dataList);
74+
viewPager.setAdapter(adapter);
75+
viewPager.setCurrentItem(adapter.getRealSize());
14176

142-
void updateApp(){
143-
try {
144-
Uri uri = Uri.parse(String.format("market://details?id=%s", "cn.com.bailian.bailianmobile"));
145-
Intent it = new Intent(Intent.ACTION_VIEW, uri);
146-
it.setPackage("com.tencent.android.qqdownloader");//com.tencent.android.qqdownloader com.huawei.appmarket
147-
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
148-
startActivity(it);
149-
}catch (Exception ex){
150-
ex.printStackTrace();
151-
Toast.makeText(this,"应用宝未安装",Toast.LENGTH_SHORT).show();
152-
}
77+
recyclerView.setLayoutManager(new LinearLayoutManager(this));
78+
recyclerView.setAdapter(stackAdapter);
15379
}
15480
}

demo/src/main/java/com/uis/stackview/demo/activity/StackAdapter.java

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,22 @@
55
import android.view.View;
66
import android.view.ViewGroup;
77
import android.widget.ImageView;
8-
import android.widget.Toast;
9-
108
import com.bumptech.glide.Glide;
119
import com.facebook.drawee.view.SimpleDraweeView;
1210
import com.uis.stackview.demo.R;
1311
import com.uis.stackview.demo.entity.ItemEntity;
1412
import com.uis.stackview.StackLayout;
15-
1613
import org.json.JSONArray;
1714
import org.json.JSONObject;
18-
1915
import java.io.InputStream;
2016
import java.util.ArrayList;
21-
17+
import java.util.List;
2218
import androidx.annotation.NonNull;
2319
import androidx.recyclerview.widget.RecyclerView;
2420

2521
public class StackAdapter extends RecyclerView.Adapter<StackAdapter.StackVH> {
2622

27-
ArrayList<ItemEntity> dataList;
23+
List<ItemEntity> dataList;
2824

2925
@NonNull
3026
@Override
@@ -47,7 +43,7 @@ public int getItemViewType(int position) {
4743

4844
@Override
4945
public int getItemCount() {
50-
return 100;
46+
return 10;
5147
}
5248

5349
public static ArrayList<ItemEntity> initDataList(Context context) {
@@ -83,40 +79,48 @@ public static class ViewHolder {
8379

8480
static class StackVH extends RecyclerView.ViewHolder{
8581
StackLayout stackLayout;
86-
public StackVH(boolean left,ViewGroup parent) {
87-
super(LayoutInflater.from(parent.getContext()).inflate(
88-
left ? R.layout.stack_left : R.layout.stack_right,parent,false));
89-
stackLayout = itemView.findViewById(R.id.stacklayout);
90-
}
82+
List<ItemEntity> stackData = new ArrayList<>();
83+
StackLayout.StackAdapter adapter = new StackLayout.StackAdapter() {
9184

92-
public void binderVH(final ArrayList<ItemEntity> dataList){
93-
stackLayout.setAdapter(new StackLayout.StackAdapter() {
85+
@Override
86+
public View onCreateView(ViewGroup parent) {
87+
return LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout,parent,false);
88+
}
9489

95-
@Override
96-
public View onCreateView(ViewGroup parent) {
97-
return LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout,parent,false);
90+
@Override
91+
public void onBindView(View view, int position) {
92+
ImageView imageView = view.findViewById(R.id.imageView);
93+
try{
94+
Glide.with(view.getContext()).load(stackData.get(position).getMapImageUrl()).into(imageView);
95+
}catch (Exception ex){
96+
ex.printStackTrace();
9897
}
98+
}
9999

100-
@Override
101-
public void onBindView(View view, int position) {
102-
ImageView imageView = view.findViewById(R.id.imageView);
103-
try{
104-
Glide.with(view.getContext()).load(dataList.get(position).getMapImageUrl()).into(imageView);
105-
}catch (Exception ex){
106-
ex.printStackTrace();
107-
}
108-
}
100+
@Override
101+
public int getItemCount() {
102+
return stackData.size();
103+
}
109104

110-
@Override
111-
public int getItemCount() {
112-
return dataList.size();
113-
}
105+
@Override
106+
public void onItemDisplay(int position) {
114107

115-
@Override
116-
public void onItemDisplay(int position) {
108+
}
109+
};
117110

118-
}
119-
});
111+
public StackVH(boolean left,ViewGroup parent) {
112+
super(LayoutInflater.from(parent.getContext()).inflate(
113+
left ? R.layout.stack_left : R.layout.stack_right,parent,false));
114+
stackLayout = itemView.findViewById(R.id.stacklayout);
115+
}
116+
117+
public void binderVH(final List<ItemEntity> dataList){
118+
stackData = dataList;
119+
if(stackLayout.getAdapter() == null) {
120+
stackLayout.setAdapter(adapter);
121+
}else{
122+
stackLayout.notifyDataChanged();
123+
}
120124
}
121125
}
122126
}

demo/src/main/java/com/uis/stackview/demo/entity/ItemEntity.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@
22

33
import org.json.JSONObject;
44

5-
/**
6-
* Created by xmuSistone on 2017/5/12.
7-
*/
8-
95
public class ItemEntity {
106

117
private String country;

0 commit comments

Comments
 (0)