2014-04-21 16 views
6

Tôi đang gặp vấn đề lạ. Tôi chia tỷ lệ hình ảnh và, trong khi chia tỷ lệ hoạt động chính xác, hình ảnh luôn bị cắt bớt. Tôi đã thử các loại quy mô khác nhau - mọi thứ đã thay đổi nhưng tôi không bao giờ có thể làm cho nó hoạt động.Tại sao hình ảnh của tôi bị cắt bớt sau khi chia tỷ lệ?

Chỉ cần được rõ ràng, đây là những gì tôi cần phải giải quyết: 1. Tôi có một HorizontalScrollView quanh ImageViewScrollView quanh HorizontalView. 2. Tôi cuộn xung quanh (sử dụng scrollTo của cả hai chế độ xem cuộn) và, khi có một sự kiện nhất định, hãy phóng to. 3. Điều tôi muốn xảy ra là dành cho ImageView để xoay quanh vị trí cuộn hiện tại của tôi.

Dưới đây là cách bố trí:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scrollbars="none" 
     android:overScrollMode="never"> 

     <HorizontalScrollView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scrollbars="none" 
      android:overScrollMode="never"> 

      <ImageView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_margin="3dp" 
       android:scaleType="fitCenter" /> 
     </HorizontalScrollView> 
    </ScrollView> 
</FrameLayout> 

Và đây là đoạn code rộng (originalWidth/originalHeight được tính theo quy mô của 1; targetView điểm đến ImageView):

public synchronized void changeScale(float newScaleFactor) { 
    this.scaleFactor = Math.max(min_zoom, Math.min(newScaleFactor, max_zoom)); 
    if (targetView != null && originalWidth > 0) { 
     int newWidth = (int)(originalWidth * scaleFactor); 
     int newHeight = (int)(originalHeight * scaleFactor); 
     onScaleChanged(targetView, scaleFactor, newWidth, newHeight); 
    } 
} 


public void onScaleChanged(View targetView, float scaleFactor, int newWidth, int newHeight) { 
    ViewGroup.LayoutParams layoutParams = targetView.getLayoutParams(); 
    layoutParams.width = newWidth; 
    layoutParams.height = newHeight; 

    // This is needed to increase the pane size (rather than zoom within the initial layout) 
    targetView.setLayoutParams(layoutParams); 
    // Tell the system to recalculate the layout 
    targetView.requestLayout(); 

    // This is needed to specify the center of scaling 
    HorizontalScrollView horizontalScrollView = (HorizontalScrollView)targetView.getParent(); 
    ScrollView vertScrollView = (ScrollView)horizontalScrollView.getParent(); 
    // ~~~ the pivot points are probably wrong 
    targetView.setPivotX(horizontalScrollView.getScrollX() * scaleFactor); 
    targetView.setPivotY(vertScrollView.getScrollY() * scaleFactor); 

    // This is needed for actual zooming 
    targetView.setScaleX(scaleFactor); 
    targetView.setScaleY(scaleFactor); 
}; 


public void zoomIn(float scaleDelta) { 
    changeScale(scaleFactor + scaleDelta); 
} 

public void zoomOut(float scaleDelta) { 
    changeScale(scaleFactor - scaleDelta); 
} 

Câu hỏi 1: Làm thế nào Tôi ngăn chặn cắt? Tôi không thể tìm thấy sự kết hợp phù hợp của scaleType và thay đổi kích thước bố cục.

Câu hỏi 2: Khi tôi sử dụng setScaleX/setScaleY, trục của tôi có được tính sau khi áp dụng hệ số tỷ lệ mới hay trình kết xuất tự động xử lý điều đó không?

+0

dường như với tôi như bạn nên xác minh rằng các giá trị bạn đang đặt cho kích thước hình ảnh của bạn nằm trong giới hạn của màn hình. Tôi tưởng tượng rằng một trong những được thiết lập đúng nhưng một trong những khác tràn. –

+0

Hình ảnh của tôi nằm trong ScrollView. Nó có thể là bất kỳ kích thước nào tôi muốn.Các clipping tôi phàn nàn về là giới hạn scrollview nơi tôi di chuyển – Yevgeniy

+0

Để tiếp tục xây dựng, vấn đề của tôi là gần như giống hệt nhau để http://stackoverflow.com/questions/4963866/how-to-change-size-of-android-scrollview. Sự khác biệt duy nhất là tôi mở rộng con của ScrollView trong khi người đó thay đổi hoàn toàn đứa trẻ. – Yevgeniy

Trả lời

1

Sau khi cập nhật tỷ lệ, bạn cần vô hiệu hóa() và requestLayout() lượt xem.

targetView.invalidate(); 
targetView.requestLayout(); 

Tôi thường tính tỷ lệ khác nhau cho hình ảnh. Bạn có thể thử mở rộng chế độ xem hình ảnh bằng cách sử dụng loại quy mô MATRIX. Bạn sẽ cần phải biết kích thước của DPI bị ràng buộc của bạn.

// Get the scaled DPI 
int boundBoxInDp = getResources().getDisplayMetrics().densityDpi * scaleFactor 

// Determine how much to scale: the dimension requiring less scaling is 
// closer to its side. This way the image always stays inside your 
// bound AND either x/y axis touches the bound but neither will go over. 
float xScale = ((float) boundBoxInDp)/newWidth; 
float yScale = ((float) boundBoxInDp)/newHeight; 
float scale = (xScale <= yScale) ? xScale : yScale; 

// scale using our calculated scale 
targetView.setScaleX(scale); 
targetView.setScaleY(scale); 

Đối với câu hỏi thứ hai của bạn về Pivot. Điều đó có thể sẽ cần phải được đặt ở giữa vùng cuộn có thể nhìn thấy. Bạn có thể tăng vùng có thể cuộn khi bạn thay đổi kích thước hình ảnh vì bạn đang sử dụng FIT_CENTER;

+0

Điều đó không hiệu quả, thật không may – Yevgeniy

0

Xem this article cho mã hoạt động khá tốt. Tôi đã bỏ qua HorizontalScrollView và ScrollView và đính kèm PanAndZoomListener này vào FrameLayout của tôi và từ đó nó là tất cả các cầu vồng và kỳ lân.

Tôi đã cố gắng làm điều tương tự như bạn, nhưng không thành công. Dường như bạn có thể cuộn một ImageView mà không sử dụng HorizontalScrollView và ScrollView. Tôi vẫn chưa rõ điều gì làm cho nó xảy ra, nhưng tôi đang hướng tới việc sử dụng ma trận hình ảnh (như trong, setImageMatrix trên ImageView) hoặc có thể sử dụng MarginLayoutParams. Khi xem mã nguồn của Thư viện từ Thư viện ảnh có sẵn trên Android, tôi thấy việc sử dụng Ma trận nặng nề. Thật không may, các tài liệu về điều này có vẻ là khá nhẹ trong dự toán của tôi.

Những người khác đã tìm ra, vì vậy hãy cắm vào PanAndZoomListener và bạn đã hoàn tất. Đó là những gì tôi đã làm.

Các vấn đề liên quan