2013-01-15 13 views
10

Pracuję nad aplikacją o złożonych układach. Niedawno zdałem sobie sprawę, że muszę wykonać części lub wszystkie moje układy, które można powiększyć.Układaj układy na Androida i układy zagnieżdżone w ramach powiększania

Jeden z moich głównych plików xml ma układ liniowy z wieloma układami zagnieżdżonymi w celu poprawnego pozycjonowania widoków. Czy istnieje prosty sposób na zrobienie tego linearnego układu i wszystkiego w ramach zoomable? A może łatwiej by było powiększyć cały plik układu? Jakie są moje opcje?

Odpowiedz

1

Możesz rzucić okiem na statyczne transformacje. Każda klasa ViewGroup lub podklasa może być dostosowana w celu zastosowania transformacji do jej widoków podrzędnych. Włączasz to, dzwoniąc pod numer setStaticTransformationsEnabled(true), a następnie przesuwając wywołanie zwrotne getChildStaticTransformation() (docs link) w swoim niestandardowym ViewGroup. Możesz zastosować dowolną transformację, którą lubisz, w tym skalę, aby utworzyć efekt powiększenia. To wywołanie zwrotne będzie wywoływane za każdym razem, gdy widok będzie wymagać przerysowania lub zostanie unieważniony.

Pamiętaj też, że używasz tego razem z akceleracją sprzętową. W zależności od częstotliwości, z jaką trzeba aktualizować transformacje, może się okazać, że sprzęt nie będzie działał tak, aby przerysować zgodnie z oczekiwaniami. Jeśli tak, musisz włączyć warstwy oprogramowania dla tej hierarchii widoku.

+0

[Przykład], (http://stackoverflow.com/questions/4261527/resizing-scaling-down-android-widgets-datepicker-and-timepicker) – Leonidos

4

Przede wszystkim rozszerzyć tę klasę z tego konkretnego widoku

public class MyImageView extends ImageView{ 

Override następującej metody.

@Override 
protected void onDraw(Canvas canvas) { 
super.onDraw(canvas); 
canvas.save(); 

canvas.scale(mScaleFactor, mScaleFactor, midPoint.x, midPoint.y); 
if(appInitialized) { 

hsSide.draw(canvas); 
scaleA.draw(canvas); 
scaleB.draw(canvas); 

    } 

canvas.restore(); 


} 

Utwórz wykrywacz gestów, który wykryje rozmiar powiększonego obiektu i możesz go ograniczyć, aby uniknąć nakładania się obiektów.

 private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 

@Override 
public boolean onScale(ScaleGestureDetector detector) { 

    mScaleFactor *= detector.getScaleFactor(); 
    pivotX = detector.getFocusX(); 
    pivotY = detector.getFocusY(); 
    // Don't let the object get too small or too large. 
    mScaleFactor = Math.max(0.8f, Math.min(mScaleFactor, 2.0f)); 

    invalidate(); 
    return true; 
    } 
} 

Po zakończeniu inicjalizacji obiektowi

ScaleGestureDetector mScaleDetector; 



    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 
+0

Dziękuję, spróbuję! – Peter

+0

Czy to działa, jeśli układ główny, do którego próbuję to zrobić, nie jest widokiem obrazu? Jest to układ z innymi widokami i układami wewnątrz niego – Peter

+0

Możesz go rozszerzyć na dowolną klasę widoku. Gest rażenia wykryje rozmiar widoku i można ograniczyć, aby odpowiednio nakładać się na inny widok – Jan