您的位置:首页 > 移动开发 > Android开发

android 弹性scollview 多功能

2016-04-05 11:33 507 查看
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;

public class ElasticityScrollview extends ScrollView {

private static final String TAG = "ElasticScrollView";

private static final float MOVE_FACTOR = 0.5f;

private static final int ANIM_TIME = 300;

private View contentView;

private float startY;

public Rect originalRect = new Rect();

private boolean canPullDown = false;

private boolean canPullUp = false;

private boolean isMoved = false;

public ElasticityScrollview(Context context) {
super(context);
}

public ElasticityScrollview(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onFinishInflate() {
super.onFinishInflate();
if (getChildCount() > 0) {
contentView = getChildAt(0);
}
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);

if (contentView == null) return;

originalRect.set(contentView.getLeft(), contentView.getTop(), contentView
.getRight(), contentView.getBottom());
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (contentView == null) {
return super.dispatchTouchEvent(ev);
}
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
canPullDown = isCanPullDown();
canPullUp = isCanPullUp();
startY = ev.getY();

break;
case MotionEvent.ACTION_UP:
if (!isMoved) break;
TranslateAnimation anim = null;

listener.scollOffset(code,0);
if(listener!=null&&Math.abs(offset )>minMoveSize){
if(code!=Mode_None){
listener.onElasticity(code);
}
}
anim = new TranslateAnimation(0, 0, contentView.getTop(), originalRect.top);
anim.setDuration(ANIM_TIME);
contentView.startAnimation(anim);
contentView.layout(originalRect.left, originalRect.top,
originalRect.right, originalRect.bottom);
canPullDown = false;
canPullUp = false;
isMoved = false;
code=0;
offset=0;
break;
case MotionEvent.ACTION_MOVE:
if (!canPullDown && !canPullUp) {
startY = ev.getY();
canPullDown = isCanPullDown();
canPullUp = isCanPullUp();
break;
}
float nowY = ev.getY();
int deltaY = (int) (nowY - startY);

boolean shouldMove =
(canPullDown && deltaY > 0)
|| (canPullUp && deltaY < 0)
|| (canPullUp && canPullDown);
if (shouldMove) {
offset = (int) (deltaY * MOVE_FACTOR);
contentView.layout(originalRect.left, originalRect.top + offset,
originalRect.right, originalRect.bottom + offset);
isMoved = true;
code =offset>0?Mode_Top:Mode_Bottom;
listener.scollOffset(code,offset);
}
break;
default:
break;
}

return super.dispatchTouchEvent(ev);
}

/**
* 判断是否滚动到顶部
*/
private boolean isCanPullDown() {
if(!isPullDownEnable)return false;
return getScrollY() == 0 ||
contentView.getHeight() < getHeight() + getScrollY();
}

/**
* 判断是否滚动到底部
*/
private boolean isCanPullUp() {
if(!isPullUpEnable)return false;
return contentView.getHeight() <= getHeight() + getScrollY();
}
private boolean isPullDownEnable=true;
private boolean isPullUpEnable=true;
private int code;
private int offset;
private OnElasticityScrollViewListener listener;
private int minMoveSize=150;
public static final int Mode_None=0,
Mode_Top = 1,//下拉
Mode_Bottom = 2;//上拉
public void setOnElasticityScrollViewListener(OnElasticityScrollViewListener listener) {
this.listener = listener;
}
public void setMoveMinSize(int moveSize){
minMoveSize=moveSize>minMoveSize?moveSize:minMoveSize;
}
public interface OnElasticityScrollViewListener {
public void onElasticity(int code);//超出范围才回调
public void scollOffset(int code,int offset);//滑动时,滑动大小
}

public void setIsPullDownEnable(boolean isPullDownEnable) {
this.isPullDownEnable = isPullDownEnable;
}

public void setIsPullUpEnable(boolean isPullUpEnable) {
this.isPullUpEnable = isPullUpEnable;
}
}

//////////////////////////////////////////////////////////////////////////////////////
使用示例
et_scrollview.setIsPullUpEnable(false);
et_scrollview.setOnElasticityScrollViewListener(new ElasticityScrollview.OnElasticityScrollViewListener() {
@Override
public void onElasticity(int code) {
switch (code) {
case ElasticityScrollview.Mode_Top:
pDetailsCall.TurnToGoodsWithAnimation();
break;
case ElasticityScrollview.Mode_Bottom:
break;
}
}

@Override
public void scollOffset(int code,int offset) {
//                if(code==ElasticityScrollview.Mode_Top){
//                    rl_top_pull.setLayoutParams(new AutoLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,(int) AutoLayout.getInstance().designToAvailable(78)+offset));
//                }
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android scollview 弹性