Skip to content

Commit 4247892

Browse files
author
uis
committed
Merge remote-tracking branch 'origin/dev' into dev
# Conflicts: # demo/src/main/java/com/uis/stackview/demo/activity/MainActivity.java # demo/src/main/res/layout/activity_main.xml
2 parents 1b3adae + d8ee9a8 commit 4247892

5 files changed

Lines changed: 81 additions & 15 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: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
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;
17+
import com.facebook.common.logging.LoggingDelegate;
1318
import com.facebook.drawee.backends.pipeline.Fresco;
1419
import com.facebook.drawee.interfaces.DraweeController;
1520
import com.facebook.imagepipeline.core.ImagePipelineConfig;
@@ -22,6 +27,7 @@
2227
import androidx.appcompat.app.AppCompatActivity;
2328
import androidx.recyclerview.widget.LinearLayoutManager;
2429
import androidx.recyclerview.widget.RecyclerView;
30+
import android.view.WindowManager;
2531
import androidx.viewpager.widget.ViewPager;
2632

2733
/**
@@ -35,8 +41,25 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
3541

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

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)