在一个view中 下拉操作 view 上部分的 图像会被拉伸 (阻尼效果)参考了一下网上的代码 只要是重写 scollerview类 和运用 scoller类来实现 scoller类在处理滑动效果方面是非常的的强大
下面附上 自定义的scollerview类 1
package com.example.testdrapscoller;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.Scroller;
public class MyScrollerView extends ScrollView {
private static final int LEN = 0xc8;
private static final int DURATION = 500;
private static final int MAX_DY = 200;
private ImageView image;
private Scroller mScroller;
private float mStartx,mStarty,currentX,currentY;
private int top,left;
private int imageH;
private int imageW;
private boolean isScoller;
private TouchTool tool;
public MyScrollerView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
mScroller = new Scroller(context);
}
public void setImage(ImageView image){
this.image = image;
}
@Override
public void computeScroll() {
// TODO Auto-generated method stub
if(mScroller.computeScrollOffset()){
int x = mScroller.getCurrX();
int y = mScroller.getCurrY();
image.layout(0, 0, x+image.getWidth(), y);
invalidate();
if (!mScroller.isFinished() && isScoller && y > MAX_DY) {
ViewGroup.LayoutParams params = image
.getLayoutParams();
params.height = y;
image.setLayoutParams(params);
}
}
super.computeScroll();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
int aciton = ev.getAction();
if(!mScroller.isFinished())
return true;
currentX = ev.getX();
currentY = ev.getY();
switch(aciton){
case MotionEvent.ACTION_DOWN:
mStartx = currentX;
mStarty = currentY;
left = image.getLeft();
top = image.getBottom();
imageH = image.getHeight();
imageW = image.getWidth();
tool = new TouchTool(image.getLeft(), image.getBottom(), image.getLeft()+LEN, image.getBottom()+LEN);
break;
case MotionEvent.ACTION_MOVE:
if(tool!=null){
int t= tool.getScrollY(currentY-mStarty);
int w = tool.getScrollX(currentX-mStartx);
if(t>=top&&t<=image.getBottom()+LEN){
ViewGroup.LayoutParams param = image.getLayoutParams();
param.height = t;
image.setLayoutParams(param);
}
isScoller = false;
}
break;
case MotionEvent.ACTION_UP:
isScoller = true;
mScroller.startScroll(image.getLeft(), image.getBottom(), 0-image.getLeft(), imageH-image.getBottom(),DURATION);
invalidate();
break;
}
return true;
}
public class TouchTool {
private int startX, startY;
public TouchTool(int startX, int startY, int endX, int endY) {
super();
this.startX = startX;
this.startY = startY;
}
public int getScrollX(float dx) {
int xx = (int) (startX + dx / 2.5F);
return xx;
}
public int getScrollY(float dy) {
int yy = (int) (startY + dy / 2.5F);
return yy;
}
}
}