2013-01-14 38 views
13

Tôi đang cố gắng triển khai pinch để phóng to trong chế độ xem danh sách trên Android và tôi đang gặp phải sự cố khi tôi nhấp và kéo chế độ xem danh sách được thu phóng. Trước tiên, đây là mã:Pinch Zoom ListView Android

public class ScaleListView extends ListView { 

private ScaleGestureDetector mScaleDetector; 
private float mScaleFactor = 1.f; 
private float x = 0; 
private float y = 0; 
private float startx = 0; 
private float starty = 0; 
private boolean canClick = true; 
private float xtranslation = 0; 

public ScaleListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 
} 
@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
     startx = ev.getX(); 
     starty = ev.getY(); 
    } 

    if (ev.getPointerCount() > 1) { 
     y = ev.getY(); 
     x = ev.getX(); 
    } else if (ev.getAction() == MotionEvent.ACTION_UP) { 
     canClick = (ev.getX() - startx) == 0 && (ev.getY() - starty) == 0 && mScaleFactor == 1; 
    } else if(ev.getAction() == MotionEvent.ACTION_MOVE){ 
     xtranslation = ev.getX() - startx; 
    }  
    mScaleDetector.onTouchEvent(ev); 
    return super.onTouchEvent(ev); 
} 
@Override 
public void onDraw(Canvas canvas) { 
    canvas.scale(mScaleFactor, mScaleFactor, x , y); 
    canvas.translate(xtranslation, 0); 
    super.onDraw(canvas); 
} 
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     canClick = false; 
     mScaleFactor *= detector.getScaleFactor(); 

     // Don't let the object get too small or too large. 
     mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f)); 

     if (mScaleFactor <= 1) { 
      mScaleFactor = 1; 
      canClick = true; 
     } 

     xPos = ScaleListView.this.getWidth() - detector.getFocusX(); 

     ScaleListView.this.invalidate(); 
     return true; 
    } 
} 
public boolean canClick(){ 
    return canClick; 
} 

Sự cố với bản dịch. Nó đi vô hạn, tôi có thể kéo nó theo chiều ngang và đưa khung nhìn danh sách ra khỏi khung nhìn. Vì vậy, tôi không thể đối mặt với cách đặt một cạnh vào bản dịch ... Cảm ơn bạn đã giúp đỡ.

+1

bạn đã tìm thấy giải pháp chưa? –

+0

No. Tôi đã cố gắng để tạo ra một số công thức toán học nhưng nó không hoạt động. – Augusto

+0

là nó có thể thêm listview ở trên bên trong ascrollview? i mực này có thể tạo ra vấn đề – fatboy

Trả lời

2

Tôi chỉ đặt cùng một tầng lớp lao động cho việc này. Hãy cho tôi biết nếu nó hoạt động cho bạn. https://github.com/Xjasz/AndroidZoomableViewGroup

+0

Tôi xin lỗi, nhưng tôi không có quyền truy cập vào mã nữa. Thật không may tôi thậm chí không nhớ những gì tôi đã làm với yêu cầu tính năng này. :(Tôi sẽ chấp nhận câu trả lời của bạn vì nó có vẻ là giải pháp tốt nhất – Augusto

+0

Thats OK Tôi chỉ muốn đăng bài này ở đâu đó. Tôi lãng phí một ngày chỉ tìm kiếm một thứ không bị hỏng để quản lý. – Xjasz

1

đang follwing hạn chế TextView tôi để màn hình cạnh .. Hy vọng điều này sẽ giúp bạn trong listview của bạn ..Tôi đã làm mã này vào HÀNH ĐỘNG: Di chuyển

layoutParams.leftMargin = X - _xDelta; 
        layoutParams.topMargin = Y - _yDelta; 
        if (layoutParams.leftMargin < 0) { 
         layoutParams.leftMargin = 20; 
        } else if (layoutParams.leftMargin > mainimage.getWidth()) { 
         layoutParams.leftMargin = mainimage.getWidth() - 20; 
        } 
        if (layoutParams.topMargin < 0) { 
         layoutParams.topMargin = 20; 
        } else if (layoutParams.topMargin > mainimage.getHeight() - 100) { 
         text.setText(text2.getText().toString()); 
         layoutParams.topMargin = mainimage.getHeight() - 90 
           - text.getHeight(); 
         // layoutParams.leftMargin = 20; 
        } 

        text.setX(layoutParams.leftMargin); 
        text.setY(layoutParams.topMargin); 

        v.setLayoutParams(text.getLayoutParams());