Skip to content

Commit a037d6d

Browse files
committed
Merge branch 'dev' of https://github.com/luiing/StackViewLayout into dev
2 parents 90b3957 + 0884802 commit a037d6d

12 files changed

Lines changed: 607 additions & 732 deletions

File tree

README.md

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,47 @@
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
7-
![效果图](/pic/002.png)
8-
![效果图](/pic/pic001.jpeg)
923

24+
![效果图](/pic/pic001.jpeg)
1025
![效果图](/pic/demo20.gif)
26+
1127
![尺寸说明](/pic/biaozhu.png)
1228

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

1531
### Use
16-
implementation 'com.uis:stacklayout:0.3.0'
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,14 +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|增加联动效果(缩放+平移)|新增功能
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
97117

98118
### License
99119

build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ buildscript {
44

55
repositories {
66
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
7+
google()
78
jcenter()
8-
google()
99
}
1010

1111
dependencies {
12-
classpath 'com.android.tools.build:gradle:3.4.2'
12+
classpath 'com.android.tools.build:gradle:3.6.3'
1313
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
1414
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
1515
}
@@ -18,8 +18,8 @@ buildscript {
1818
allprojects {
1919
repositories {
2020
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
21+
google()
2122
jcenter()
22-
google()
2323
}
2424
}
2525

demo/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ 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.2.0'
3333
implementation project(':stacklayout')
3434
}
Lines changed: 6 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,22 @@
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;
15-
16-
import com.facebook.common.logging.FLog;
17-
import com.facebook.common.logging.LoggingDelegate;
189
import com.facebook.drawee.backends.pipeline.Fresco;
19-
import com.facebook.drawee.interfaces.DraweeController;
20-
import com.facebook.drawee.view.SimpleDraweeView;
2110
import com.facebook.imagepipeline.core.ImagePipelineConfig;
22-
import com.google.gson.Gson;
23-
import com.uis.stackview.StackLayout;
2411
import com.uis.stackview.demo.R;
2512
import com.uis.stackview.demo.entity.ItemEntity;
2613
import java.util.List;
27-
2814
import androidx.appcompat.app.AppCompatActivity;
2915
import androidx.recyclerview.widget.LinearLayoutManager;
3016
import androidx.recyclerview.widget.RecyclerView;
31-
import android.view.WindowManager;
3217
import androidx.viewpager.widget.ViewPager;
3318

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;
19+
public class MainActivity extends AppCompatActivity{
4220

4321
@Override
4422
protected void onCreate(Bundle savedInstanceState) {
@@ -54,101 +32,30 @@ protected void onCreate(Bundle savedInstanceState) {
5432
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
5533
}
5634
}
57-
5835
super.onCreate(savedInstanceState);
5936
setContentView(R.layout.activity_main);
6037
if(Build.VERSION.SDK_INT >= 19){
6138
ViewGroup.LayoutParams params = findViewById(R.id.view).getLayoutParams();
6239
params.height = getResources().getDimensionPixelSize(R.dimen.status_height);
6340
}
64-
FLog.setMinimumLoggingLevel(FLog.VERBOSE);
6541
if(!Fresco.hasBeenInitialized()) {
6642
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(getApplicationContext())
6743
.setDiskCacheEnabled(true)
6844
.setDownsampleEnabled(true)
6945
.build();
7046
Fresco.initialize(getApplicationContext(), config);
7147
}
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);
7648

77-
dataList = StackAdapter.initDataList(this);
49+
final List<ItemEntity> dataList = StackAdapter.initDataList(this);
50+
final StackAdapter stackAdapter = new StackAdapter();
51+
final RecyclerView recyclerView = findViewById(R.id.recyclerView);
52+
7853
ViewPager viewPager = findViewById(R.id.viewPager);
7954
ViewPagerAdapter adapter = new ViewPagerAdapter(dataList);
8055
viewPager.setAdapter(adapter);
8156
viewPager.setCurrentItem(adapter.getRealSize());
8257

8358
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-
}
103-
104-
@Override
105-
public int getItemCount() {
106-
return dataList.size();
107-
}
108-
109-
@Override
110-
public void onItemDisplay(int position) {
111-
Log.e("xx","display = " + position);
112-
}
113-
114-
@Override
115-
public void onItemClicked(int position) {
116-
Log.e("xx","clicked = " + position);
117-
stackViewLayout.setStackLooper(false);
118-
stackViewLayout.setPosition(position+3);
119-
}
120-
});
121-
}
122-
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-
}
135-
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-
}
141-
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-
}
59+
recyclerView.setAdapter(stackAdapter);
15360
}
15461
}

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,int viewType) {
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)