मैं एंड्रॉइड के Canvas
के साथ कुछ काम कर रहा हूं, विशेष रूप से यह निर्धारित करने की कोशिश कर रहा हूं कि इसके getClipBounds
परिणाम निर्धारित किए गए हैं। मैं समझता हूं कि Canvas
आंतरिक रूप से एक ट्रांसफॉर्म Matrix
रखता है जिसे अपडेट किया गया है क्योंकि मैं translate
, scale
आदि पर कॉल करता हूं लेकिन Matrix
के परिणामों को दोहराने की कोशिश कर रहा हूं।कैनवास कैसे इसकी क्लिप सीमा निर्धारित करता है?
@Override
public void onDraw(Canvas canvas) {
Rect clipBounds;
RectF viewport;
canvas.save();
canvas.concat(translationMatrix);
//viewportMatrix.preConcat(canvas.getMatrix());
viewportMatrix.set(canvas.getMatrix());
clipBounds = canvas.getClipBounds();
viewport = GetViewport();
Log.d("clipBounds", clipBounds.toString() + " (" + clipBounds.width() + ", " + clipBounds.height() + ")");
Log.d("viewport", viewport.toString() + " (" + viewport.width() + ", " + viewport.height() + ")");
//drawing is done here
canvas.restore();
}
//viewport code modeled after http://stackoverflow.com/a/17142856/2245528
private RectF GetViewport() {
RectF viewport = new RectF();
viewportMatrix.mapRect(viewport, originalViewport);
return viewport;
}
private void Translate(float x, float y) {
translationMatrix.postTranslate(x, y);
invalidate();
}
private void Scale(float scaleFactor, PointF focusPoint) {
if (focusPoint == null) {
translationMatrix.postScale(scaleFactor, scaleFactor);
}
//keep the focus point in focus if possible
else {
translationMatrix.postScale(scaleFactor, scaleFactor, focusPoint.x, focusPoint.y);
}
invalidate();
}
private final Matrix translationMatrix = new Matrix();
private final RectF originalViewport = new RectF();
private final Matrix viewportMatrix = new Matrix();
originalViewport
0, 0, canvas.getWidth(), canvas.getHeight()
को तैयार है। Translate
और Scale
इशारा ईवेंट हैंडलर से बुलाए जाते हैं, जो सही तरीके से काम कर रहे हैं।
जो भाग मुझे भ्रमित करता है वह viewportMatrix
है। इससे कोई फर्क करने के लिए मुझे क्या करना है कि क्या नहीं लगता है
viewportMatrix.set(canvas.getMatrix());
या
viewportMatrix.preConcat(canvas.getMatrix());
या शुरुआत साथ-पक्ष द्वारा पीछा किया पर
viewportMatrix.set(canvas.getMatrix());
को भी एक बार की कॉल Translate
/Scale
दो मैट्रिक्स को कॉल करता है। मैं भी पूरी तरह से Matrix
में निर्मित Canvas
की अनदेखी की है की कोशिश की और फिर से लिखने GetViewport
रूप
//viewport code modeled after http://stackoverflow.com/a/17142856/2245528
private RectF GetViewport() {
RectF viewport = new RectF();
translationMatrix.mapRect(viewport, originalViewport);
return viewport;
}
मैं getClipBounds()
मिलते हुए लगते हैं कभी नहीं कर सकते हैं और विसंगतियों काफी गंभीर हैं:
viewportMatrix.set(canvas.getMatrix)
साथ:
साथclipBounds: रेक्ट (-97, -97 - 602, 452) (699, 549)
व्यूपोर्ट: RectF (९७.०४,१७८, ९७.०६,०३६, ७९७.०४,१७५, 647। 06,036) (700.0, 550,0)
:
clipBounds: रेक्ट (-97, -96 - 602, 453) (699, 549)
व्यूपोर्ट: RectF (2708.9663, 2722.2754, 3408.9663, 3272.2754) (700.0, 550,0)
translationMatrix.mapRect
साथ:
एक एक के साथclipBounds: रेक्ट (-96, -96 - 603, 453) (699, 549)
व्यूपोर्ट: RectF (९६.७३,२१३, ९६.८५,७९४, 796.7321, 646.8579) (700.0, 550,0)
viewportMatrix.preConcat(canvas.getMatrix())
को -shot कॉल साइड-बाई-साइड Translate
/Scale
कॉल के बाद:
clipBounds: रेक्ट (-96, -97 - 603, 452) (699, 549)
व्यूपोर्ट: RectF (९६.५७,७३८, 97.78168, 796.5774, 647.7817) (700.0, 550।0)
viewportMatrix.set(canvas.getMatrix())
करने के लिए एक एक शॉट कॉल साइड-बाई-साइड
Translate
/
Scale
कॉल के बाद साथ
:
clipBounds: रेक्ट (-96, -96 - 603, 453) (699 , 549)
व्यूपोर्ट: RectF (९६.४०,०५१, ९६.८८,१५३, 796.4005, ६४६.८८,१५३) (700.0, 550,0)
मैं भी the Canvas
source जांच नहीं कर सकता, सभी Matrix
कोड के रूप में निजी नेट में गायब हो जाती है ive कॉल जिसका कोड नहीं दिखाया गया है।
मेरे GetViewport
इतने बड़े पैमाने पर क्यों कॉल कर रहे हैं, और getClipBounds
के साथ दृश्यों के पीछे क्या चल रहा है?