public class MyScrollView_1Activity extends Activity {
int[] ids = new int[] { R.drawable.a1, R.drawable.a3,
R.drawable.a4, R.drawable.a5};
private MyScrollView scrollView;
private Context ctx;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
ctx = this;
scrollView = new MyScrollView(this);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, -1);
for (int i = 0; i < ids.length; i++) {
ImageView iv = new ImageView(this);
iv.setBackgroundResource(ids[i]);
scrollView.addView(iv, params);
}
setContentView(scrollView);
}
}
public class MyScrollView extends ViewGroup {
private GestureDetector detector;
private MyScrollView_1Activity ctx;
private Scroller scroller;
public MyScrollView(Context context) {
super(context);
this.ctx = (MyScrollView_1Activity) context;
initView();
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
for (int i = 0; i < getChildCount(); i++) {
View view = getChildAt(i);
view.layout(1 + i * getWidth(), t, r + i * getWidth(), b);
}
}
private void initView() {
scroller = new Scroller(ctx);
detector = new GestureDetector(new OnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
scrollBy((int) distanceX, 0);
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
detector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
moveToDest();
break;
}
return true;
}
public void moveToDest() {
int dest = (getScrollX() + getWidth() / 2) / getWidth();
moveToDest(dest);
}
private void moveToDest(int dest) {
int distance = dest * getWidth() - getScrollX();
scroller.startScroll(getScrollX(), 0, distance, 0);
invalidate();
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), 0);
postInvalidate();
}
}
}
转载于:https://blog.51cto.com/uxlwsfmf/1220240