Skip to content

Commit fc09540

Browse files
committed
Merge remote-tracking branch 'remotes/origin/dev'
2 parents b368180 + d8ee9a8 commit fc09540

7 files changed

Lines changed: 83 additions & 29 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
![效果图](/pic/demo20.gif)
1010

1111
### Use
12-
implementation 'com.uis:stacklayout:0.1.1'
12+
implementation 'com.uis:stacklayout:0.1.2'
1313

1414
*Name*| *Descript*|*Value*
1515
-----|--------|---
@@ -91,6 +91,7 @@ stackEdgeModel|层叠位置|left/right
9191
0.0.2|滑动从顶层加入,整体下沉|fixed 内部view点击事件
9292
0.1.0|zoomX,zoomY呈等比数列|更改属性
9393
0.1.1|只有一条数据时|fixed
94+
0.1.2|增加动画、轮播时间设置,获取当前选中位置|新增方法
9495

9596
### Thanks
9697

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package com.uis.stackview.demo.activity;
22

33
import android.content.Intent;
4+
import android.graphics.Color;
45
import android.net.Uri;
6+
import android.os.Build;
57
import android.os.Bundle;
68
import android.util.Log;
79
import android.view.LayoutInflater;
810
import android.view.View;
911
import android.view.ViewGroup;
12+
import android.view.Window;
13+
import android.view.WindowManager;
1014
import android.widget.Toast;
1115

1216
import com.facebook.common.logging.FLog;
@@ -23,7 +27,7 @@
2327
import androidx.appcompat.app.AppCompatActivity;
2428
import androidx.recyclerview.widget.LinearLayoutManager;
2529
import androidx.recyclerview.widget.RecyclerView;
26-
30+
import android.view.WindowManager;
2731
/**
2832
* Created by xmuSistone on 2017/5/12.
2933
*/
@@ -35,8 +39,25 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
3539

3640
@Override
3741
protected void onCreate(Bundle savedInstanceState) {
42+
if(Build.VERSION.SDK_INT >= 19){
43+
if(Build.VERSION.SDK_INT >= 23){
44+
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
45+
getWindow().setStatusBarColor(Color.TRANSPARENT);
46+
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
47+
//只有白色背景需加上此flag
48+
|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
49+
);
50+
}else {
51+
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
52+
}
53+
}
54+
3855
super.onCreate(savedInstanceState);
3956
setContentView(R.layout.activity_main);
57+
if(Build.VERSION.SDK_INT >= 19){
58+
ViewGroup.LayoutParams params = findViewById(R.id.view).getLayoutParams();
59+
params.height = getResources().getDimensionPixelSize(R.dimen.status_height);
60+
}
4061
FLog.setMinimumLoggingLevel(FLog.VERBOSE);
4162
if(!Fresco.hasBeenInitialized()) {
4263
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(getApplicationContext())

demo/src/main/res/layout/activity_main.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
android:layout_height="match_parent"
66
android:background="#fff"
77
android:orientation="vertical">
8+
<View android:id="@+id/view"
9+
android:layout_width="match_parent"
10+
android:layout_height="0dp"/>
811
<include layout="@layout/stack_right"/>
9-
1012
<Button android:id="@+id/bt_web"
1113
android:layout_width="match_parent"
1214
android:layout_height="wrap_content"

demo/src/main/res/values-v23/styles.xml

Lines changed: 0 additions & 12 deletions
This file was deleted.

demo/src/main/res/values/dimens.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
<!-- Default screen margins, per the Android Design guidelines. -->
33
<dimen name="activity_horizontal_margin">16dp</dimen>
44
<dimen name="activity_vertical_margin">16dp</dimen>
5+
<dimen name="status_height">24dp</dimen>
56
</resources>

stacklayout/src/main/java/com/uis/stackview/StackHelper.java

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,14 @@ final class StackHelper implements ValueAnimator.AnimatorUpdateListener{
4444
private boolean isFingerTouch = false;
4545
private boolean enableScroll = false;
4646
private int displayPosition = 0;
47+
private int mDuration = 500;
48+
private int mDelay = 3000;
4749
private StackLayout layout;
48-
private boolean debug = false;
50+
private boolean debug = true;
4951

5052
StackHelper(int touchSlop) {
5153
mTouchSlop = touchSlop;
54+
mAnimator.setDurations(mDuration);
5255
}
5356

5457
void bindLayout(StackLayout layout) {
@@ -169,6 +172,19 @@ void setPosition(int position){
169172
}
170173
}
171174

175+
int getPosition(){
176+
return displayPosition;
177+
}
178+
179+
void setDuration(int duration){
180+
mDuration = duration;
181+
mAnimator.setDurations(mDuration);
182+
}
183+
184+
void setLooperDelay(int mills){
185+
mDelay = mills;
186+
}
187+
172188
private View getStackView(){
173189
View view = null;
174190
for (WeakReference<View> item ;weakViews.size() > 0;){
@@ -254,21 +270,22 @@ void releaseScroll(int velocity){
254270
float transX = mAnimator.getTranslationX();
255271
if(layout.getAdapter() != null && Math.abs(transX) > 0 && !mAnimator.isRunning()) {
256272
//滑动速度大于限定或者滑动距离大于宽度一部分,移出当前视图可视范围
257-
if(Math.abs(velocity) >= everyWidth || Math.abs(transX) > mMaxDistance){
258-
int sign = MODEL_LEFT == swipModel ? -1 : 1;
273+
int sign = MODEL_LEFT == swipModel ? -1 : 1;
274+
/** 加入防抖动 */
275+
if( (velocity*sign>=0 || Math.abs(velocity)<3*mTouchSlop) && (Math.abs(velocity) >= everyWidth|| Math.abs(transX) > mMaxDistance)){
259276
if(isTopRemove){
260277
addBottomView();
261278
transX = layout.getWidth()*sign - transX;
262-
mAnimator.startAnimator(true,false,transX,mMaxDistance,this);
279+
mAnimator.startAnimator(true,false,transX,this);
263280
}else{
264281
removeBottomView();
265282
transX = everyWidth*sign - transX;
266-
mAnimator.startAnimator(false,false,transX,mMaxDistance,this);
283+
mAnimator.startAnimator(false,false,transX,this);
267284
}
268285
}else {
269286
//取反恢复原样
270287
transX *= -1;
271-
mAnimator.startAnimator(!isTopRemove,false,transX,mMaxDistance,this);
288+
mAnimator.startAnimator(!isTopRemove,false,transX,this);
272289
}
273290
swipModel = MODEL_NONE;
274291
}
@@ -279,7 +296,7 @@ void autoScroll(){
279296
mAnimator.setAnimatorView(layout.getChildAt(layout.getChildCount() - 1));
280297
int transX = (layout.stackEdgeModel == MODEL_LEFT ? 1 : -1)*layout.getWidth();
281298
isTopRemove = true;
282-
mAnimator.startAnimator(true,true,transX,mMaxDistance,this);
299+
mAnimator.startAnimator(true,true,transX,this);
283300
}
284301
}
285302

@@ -289,7 +306,7 @@ void setAutoPlay(boolean looper){
289306
executor = new ScheduledThreadPoolExecutor(2);
290307
}
291308
if(executor.getQueue().size() <= 0) {
292-
executor.scheduleWithFixedDelay(new AutoRunnable(this), 2, 3, TimeUnit.SECONDS);
309+
executor.scheduleWithFixedDelay(new AutoRunnable(this), 2000, mDelay, TimeUnit.MILLISECONDS);
293310
}
294311
}else {
295312
if(executor != null && !executor.isShutdown()) {
@@ -359,6 +376,16 @@ static class ReleaseAnimator{
359376
private Interpolator interpolatorAuto = new LinearInterpolator();
360377
private boolean needRemoveTopView = false;
361378
private boolean needAddBottomView;
379+
private int duration;
380+
private int mWidth;
381+
382+
public ReleaseAnimator() {
383+
mWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
384+
}
385+
386+
void setDurations(int duration){
387+
this.duration = duration;
388+
}
362389

363390
void setAnimatorView(View view){
364391
mAnimatorView = view;
@@ -388,11 +415,11 @@ void setTranslationX(float value){
388415
lastValue = value;
389416
}
390417

391-
void startAnimator(boolean needRemoveTop,boolean needAddBottom,float transX, int distance, ValueAnimator.AnimatorUpdateListener listener){
392-
int duration = needAddBottom ? 400 : (int)(Math.abs(transX)/distance*100);
418+
void startAnimator(boolean needRemoveTop,boolean needAddBottom,float transX, ValueAnimator.AnimatorUpdateListener listener){
419+
int mills = needAddBottom ? duration : (int)(1.2*duration*Math.abs(transX)/mWidth);
393420
needAddBottomView = needAddBottom;
394421
needRemoveTopView = needRemoveTop;
395-
animator = ValueAnimator.ofFloat(0f, transX).setDuration(duration);
422+
animator = ValueAnimator.ofFloat(0f, transX).setDuration(mills);
396423
animator.setInterpolator(needAddBottom ? interpolatorAuto : interpolator);
397424
animator.addUpdateListener(listener);
398425
animator.start();

stacklayout/src/main/java/com/uis/stackview/StackLayout.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,22 @@ public void setPosition(int position){
137137
stackHelper.setPosition(position);
138138
}
139139

140+
public int getSelectedPosition(){
141+
return stackHelper.getPosition();
142+
}
143+
144+
public void setDuration(int duration){
145+
stackHelper.setDuration(duration);
146+
}
147+
148+
/**
149+
* looper delay
150+
* @param mills 1000 is 1 second
151+
*/
152+
public void setLooperDelay(int mills){
153+
stackHelper.setLooperDelay(mills);
154+
}
155+
140156
@Override
141157
public boolean onInterceptTouchEvent(MotionEvent event) {
142158
//stackHelper.log("act="+event.getActionMasked());
@@ -225,9 +241,7 @@ public static abstract class StackAdapter{
225241

226242
public abstract void onBindView(View view, int index);
227243

228-
public int getItemCount(){
229-
return 0;
230-
}
244+
public abstract int getItemCount();
231245

232246
public void onItemDisplay(int position) {
233247
}

0 commit comments

Comments
 (0)