Tôi đang cố gắng tạo một ViewGroup hỗ trợ việc phóng to và thu phóng nội dung của nó. Tất cả những gì tôi có thể tìm thấy trực tuyến là ý tưởng và triển khai để thực hiện điều đó trong một ImageView, nhưng không bao giờ là một thùng chứa. Tôi muốn hiển thị một bản đồ, và trên đầu trang của nó tôi muốn hiển thị nhiều điểm đánh dấu là ImageButtons, vì vậy người dùng có thể chạm vào chúng để có thêm thông tin. Điều này đạt được trên iOS bằng phương tiện của UIScrollView, nhưng tôi không thể tìm thấy một thay thế trên Android.Xây dựng hộp chứa có thể thu phóng/có thể mở rộng
Tôi quyết định sử dụng FrameView, vì vậy tôi có thể đặt ImageView với hình ảnh làm nền và phía trên nó thêm RelativeLayout, trên đó tôi có thể thêm ImageButton và định vị chúng bằng lề.
Tôi đã mượn một phần của việc triển khai TouchImageView here, nhưng tôi đã gặp phải các biến chứng. Tôi đã bắt đầu với panning, và tôi một phần thành công, nó chảo container xung quanh, nhưng panning hoạt động hideously, nó jitters rất nhiều. Đây là mã của tôi:
public class ScrollingViewGroup extends FrameLayout {
private int x = 0;
private int y = 0;
// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
// Remember some things for zooming
PointF last = new PointF();
PointF start = new PointF();
public ScrollingViewGroup(Context context) {
super(context);
sharedConstructing(context);
}
public ScrollingViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
sharedConstructing(context);
}
private void sharedConstructing(Context context) {
super.setClickable(true);
this.context = context;
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
PointF curr = new PointF(event.getX(), event.getY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
last.set(event.getX(), event.getY());
start.set(last);
mode = DRAG;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
float deltaX = curr.x - last.x;
float deltaY = curr.y - last.y;
Log.d("ScrollingViewGroup", Float.toString(deltaX));
Log.d("ScrollingViewGroup", Float.toString(deltaY));
float scaleWidth = Math.round(origWidth * saveScale);
float scaleHeight = Math.round(origHeight * saveScale);
x += deltaX;
y += deltaY;
last.set(curr.x, curr.y);
}
break;
case MotionEvent.ACTION_UP:
mode = NONE;
int xDiff = (int) Math.abs(curr.x - start.x);
int yDiff = (int) Math.abs(curr.y - start.y);
if (xDiff < CLICK && yDiff < CLICK)
performClick();
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
}
// setImageMatrix(matrix);
setTranslationX(x);
setTranslationY(y);
invalidate();
return true; // indicate event was handled
}
});
}
Mọi ý tưởng đều rất được đánh giá cao.
chỉnh sửa: jitter có vẻ là nguyên nhân bởi vì khi di chuyển, deltaX và deltaY thay thế giữa số dương và âm, kiểm tra LogCat ... vẫn không chắc chắn lý do. Điều này được gây ra bởi biến curr cung cấp các giá trị khác nhau mỗi lần, nhưng thay vì nhất quán, chúng có vẻ như ngón tay sẽ di chuyển qua lại thay vì chỉ tiến lên. Ví dụ, thay vì curr.x là 0,1,2,3,4, vv, nó là 0,1,0,5,2,1,5, vv .. Không chắc chắn lý do tại sao một trong hai.
Bạn đã bao giờ tìm được giải pháp cho điều này chưa? Tôi đang tìm kiếm chính xác điều tương tự. Một bản đồ zoom/pan có thể với các nút – 0xSina
Xin lỗi, tôi đã rời công ty một lúc và tôi không thể cung cấp mã, tôi đã tìm thấy một số cách giải quyết, nhưng không thể nhớ lại tôi đã làm như thế nào. –