android 不滚动列表,android – 可缩放列表视图不滚动

我有一个问题:我的自定义列表视图在缩放前不会滚动.缩放按预期工作.我该如何解决这个问题?

ZoomableListView:

public class ZoomableListView extends ListView {

private ScaleGestureDetector mScaleDetector;

private float mScaleFactor = 1.f;

private boolean isPagerEnabled;

private static final int INVALID_POINTER_ID = -1;

// The ‘active pointer’ is the one currently moving our object.

private int mActivePointerId = INVALID_POINTER_ID;

private float mPosX;

private float mPosY;

private float mLastTouchX;

private float mLastTouchY;

// Pivot point for Scaling

static float gx = 0, gy = 0;

public ZoomableListView(Context context, AttributeSet attrs) {

super(context, attrs);

mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener());

}

public ZoomableListView(Context context) {

super(context);

mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener());

}

@Override

public void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.save(Canvas.MATRIX_SAVE_FLAG);

canvas.translate(mPosX, mPosY);

canvas.scale(mScaleFactor, mScaleFactor);

canvas.restore();

}

@Override

protected void dispatchDraw(Canvas canvas) {

// Save the canvas to set the scaling factor returned from detector

canvas.save(Canvas.MATRIX_SAVE_FLAG);

if (mScaleFactor == 1.0f) {

isPagerEnabled = true;

} else {

isPagerEnabled = false;

}

if (mScaleFactor == 1.0f) {

mPosX = 0.0f;

mPosY = 0.0f;

}

canvas.translate(mPosX, mPosY);

canvas.scale(mScaleFactor, mScaleFactor);

super.dispatchDraw(canvas);

canvas.restore();

invalidate();

}

@Override

public boolean onTouchEvent(MotionEvent ev) {

final int action = ev.getAction();

mScaleDetector.onTouchEvent(ev);

switch (action & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN: {

final float x = ev.getX();

final float y = ev.getY();

mLastTouchX = x;

mLastTouchY = y;

// Save the ID of this pointer

mActivePointerId = ev.getPointerId(0);

break;

}

case MotionEvent.ACTION_MOVE: {

// Find the index of the active pointer and fetch its position

final int pointerIndex = ev.findPointerIndex(mActivePointerId);

final float x = ev.getX(pointerIndex);

final float y = ev.getY(pointerIndex);

final float dx = x - mLastTouchX;

final float dy = y - mLastTouchY;

mPosX += dx;

mPosY += dy;

mLastTouchX = x;

mLastTouchY = y;

invalidate();

break;

}

case MotionEvent.ACTION_UP: {

mActivePointerId = INVALID_POINTER_ID;

break;

}

case MotionEvent.ACTION_CANCEL: {

mActivePointerId = INVALID_POINTER_ID;

break;

}

case MotionEvent.ACTION_POINTER_UP: {

// Extract the index of the pointer that left the touch sensor

final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;

final int pointerId = ev.getPointerId(pointerIndex);

if (pointerId == mActivePointerId) {

// This was our active pointer going up. Choose a new

// active pointer and adjust accordingly.

final int newPointerIndex = pointerIndex == 0 ? 1 : 0;

mLastTouchX = ev.getX(newPointerIndex);

mLastTouchY = ev.getY(newPointerIndex);

mActivePointerId = ev.getPointerId(newPointerIndex);

}

break;

}

}

return true;

}

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {

@Override

public boolean onScale(ScaleGestureDetector detector) {

mScaleFactor *= detector.getScaleFactor();

// Don't let the object get too small or too large.

mScaleFactor = Math.max(1.0f, Math.min(mScaleFactor, 3.0f));

invalidate();

return true;

}

}

}

这是自定义列表视图的XML:

android:id="@android:id/list"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_marginBottom="40dp"

android:divider="@android:color/darker_gray"

android:dividerHeight="1dp" >

谢谢你的任何答案.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值