2012-01-22 27 views
7

Tôi đã có một nhóm hình ảnh đơn, được hiển thị theo yêu cầu (phần nào trong tổng số hình ảnh hiển thị trên màn hình). Hình ảnh tổng hợp lớn hơn đáng kể so với màn hình. Mỗi viên gạch được đặt chặt chẽ bên cạnh các láng giềng của nó để tạo ra ảo ảnh của một hình ảnh duy nhất (hình ảnh đơn lẻ, nếu không được lát gạch, sẽ quá lớn và có lỗi OOM).Android - chia tỷ lệ một nhóm xem (bố cục) tại thời gian chạy

Đây là ImageViews bên trong FrameLayout, được định vị bằng top/leftMargin.

Nhắm mục tiêu API 2.2/SDK 8

Tôi đang cố gắng để mở rộng hình ảnh tổng để đáp ứng với sự kiện người dùng (nút ép, nhúm, vv).

Rõ ràng setScale không khả dụng cho đến API 11. Tôi đã thử sử dụng canvas.scale trong onDraw của FrameLayout với setWillNotDraw (false) và onDraw đang được gọi, nhưng không áp dụng tỷ lệ (tôi giả định vì bố cục không có bất kỳ thông tin đồ họa? Tôi đã giả định nó sẽ làm cho nó là trẻ em là tốt, nhưng tôi đoán không trừ khi tôi đang làm điều gì đó sai ở đây cũng có).

Tôi đoán tôi có thể lặp qua từng ô và chia tỷ lệ hình ảnh một cách độc lập, nhưng cũng cần phải định vị lại từng ô, mỗi lần.

Tôi phải nghĩ rằng có một cách để mở rộng Chế độ xem gốc (ViewGroup?) Sao cho tất cả các con của nó cũng được thu nhỏ (giống như mọi ngôn ngữ khác chịu trách nhiệm quản lý GUI). Tôi đang thiếu gì?

Cảm ơn

Trả lời

8

Để tham khảo, phương pháp được đề cập ở trên (thực tế là onDraw của một nhóm phụ huynh) thực tế hoạt động. Tôi đã được sử dụng canvas.save() trước khi chuyển đổi và canvas.restore() sau (dựa trên một số ví dụ), đó là không chính xác.

Sau đây là một lớp con chung của FrameLayout mà sẽ mở rộng nó là trẻ em

package com.whatever.layouts; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.widget.FrameLayout; 

public class ScalingFrameLayout extends FrameLayout { 

    private float scale = 1; 

    public ScalingFrameLayout(Context context) { 
     super(context); 
     setWillNotDraw(false); 
    } 

    public void setScale(float factor){ 
     scale = factor; 
     invalidate(); 
    } 
    public float getScale(){ 
     return scale; 
    } 

    @Override 
    public void onDraw(Canvas canvas){ 
     canvas.scale(scale, scale); 
     super.onDraw(canvas); 
    } 

} 
+0

Wow, đó là khá mở mắt, cảm ơn bạn! Nhưng tôi đoán nó có ý nghĩa (nó dễ dàng hơn để đạt được một conclussion biết câu trả lời;)). Chúng tôi không muốn lưu và khôi phục canvas về trạng thái trước đó của nó, vì đó là thay đổi mà chúng tôi muốn, Được tạo trực tiếp trên cùng một lớp. Một lần nữa, chúc mừng :) – aMiGo

+0

Về canvas.save() và canvas.restore(), tôi đã làm điều tương tự. và thực sự không có chúng, nó đang hoạt động. vì vậy bạn có thể cho tôi biết lý do tại sao trong [trang phát triển android] (http://developer.android.com/training/gestures/scale.html) họ đang đặt những dòng đó không? – AsafK

+1

@AsafK Tôi không biết. – momo

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