2012-09-05 9 views
7

पर क्लिप करने का कारण बनता है, मैं अपने कस्टम लेआउट को स्केल करने के लिए NineOldAndroids लाइब्रेरी का उपयोग करता हूं।Android ViewGroup.setScaleX() दृश्य को

public class MyLayout extends FrameLayout { 
    // LayoutParams.MATCH_PARENT and all. 
    ... 
    @Override 
    public boolean setPositionAndScale(ViewGroup v, PositionAndScale pas, PointInfo pi) { 
    ... 
    mScale = pas.getScale(); 
    ViewHelper.setScaleX(this, mScale); 
    ViewHelper.setScaleY(this, mScale); 
    } 
} 

मैंने फ्रेमलाउट और निरपेक्ष लेआउट का प्रयास किया है। सभी का एक ही प्रभाव है। जब mScale < 1.0स्केलिंग/ज़ूमिंग काम लेकिन लेआउट का हिस्सा क्लिप किया गया है।

mScale = 1.0:

mScale = 1.0

mScale < 1.0:स्केलिंग/ज़ूम काम करता है लेकिन लेआउट क्लिप किया गया है

mScale < 1.0

मैं इसका समाधान कैसे कर सकते हैं?

संपादित करें: तस्वीर आईसीएस पर ली गई थी। इसलिए मुझे नहीं लगता कि यह नाइनऑल्ड एंड्रॉइड समस्या है।

+0

आउटपुट की तरह आप क्या उम्मीद कर रहे हैं? – alanv

+0

MapView की तरह कुछ। यह लेआउट ('MyLayout') पूरी स्क्रीन भरता है और 2. तस्वीर में जैसे क्लिप नहीं किया जाता है। MyLayout के लेआउट पैराम match_parent सेट हैं। – user802421

उत्तर

2

यदि कोई मेरे जैसा ही स्थिति में आता है। मैं इस दृष्टिकोण का उपयोग कर समाप्त हो गया:

protected void setScale(float scale, boolean updateView) { 
    mScale = scale; 
    if (updateView) { 
     LayoutParams params = getLayoutParams(); 
     onUpdateScale(scale, params); 
     setLayoutParams(params); 
    } 
} 

protected void onUpdateScale(float scale, LayoutParams params) { 
    params.leftMargin = (int) (mModel.getX() * scale); 
    params.topMargin = (int) (mModel.getY() * scale); 
    params.width = (int) (mModel.getWidth() * scale); 
    params.height = (int) (mModel.getHeight() * scale); 
} 
+0

क्या यह दृष्टिकोण तेज़ है? मेरा मतलब है, क्या आप स्केल करने के लिए इशारा करते हुए कुछ का उपयोग करके बहुत सारे अपडेट कर रहे हैं, या आप उस समय केवल एक बार स्केल करते हैं? –

+0

मैंने अभी तक बेंचमार्क या ट्रेसव्यू नहीं चलाया है, लेकिन यह ज़ूम 1 और नेक्सस एस पर काम करता है। आवश्यकताएं थीं कि आगे बढ़ने और स्केलिंग लगातार होने की आवश्यकता है (जैसे Google मानचित्र) और एक बार जब इंटरैक्शन खत्म हो जाए (जैसे ओएसएमट्रैकर ज़ूम करना)। – user802421

+0

तो, कोई झटका नहीं? (+1 अगर आप उत्तर दें :-)) –

1

यदि मैं आपकी समस्या को सही ढंग से समझता हूं, तो आप एक व्यू समूह को स्केल कर रहे हैं और उम्मीदवारों को तदनुसार स्केल करने की उम्मीद करते हैं। यह इस तरह से काम नहीं करता है: आप दृश्य समूह को स्केल करते हैं और यह आकार बदलता है, लेकिन इसके बच्चों के विचार नहीं करते हैं।

बस सभी सबव्यूज़ स्केल करें। फिर भी, मुझे यकीन नहीं है कि ग्रंथों और छवियों को स्वचालित रूप से स्केल किया जा रहा है। आप जो चाहते हैं वह ज़ूम है, स्केल नहीं। this reference आज़माएं।

+0

ज़ूम और स्केल के बीच क्या अंतर है? तस्वीर 2 दिखाता है कि ज़ूमिंग/स्केलिंग काम करता है (mScale ~ 0.8)।यह सिर्फ इतना है कि व्यू ग्रुप फिसल गया है। – user802421

+0

ठीक है, आपका संदर्भ मेरे कोड के समान ही करता है। – user802421

+0

मैं अपने जवाब सेवानिवृत्त हूं, शोर के लिए खेद है। – alexfernandez

1

एपीआई स्तर 11 के बाद से, View कक्षा में setScaleX() और setScaleY() विधियां हैं, जो अपेक्षित कार्य करती हैं और स्केल किए गए दृश्य के उप-दृश्य भी स्केल करती हैं। इसलिए, यदि यह आपके लिए एक तरीका होगा, तो लाइब्रेरी छोड़ें और बस

v.setScaleX(mScale); 
v.setScaleY(mScale); 
+0

मैंने पहले कोशिश की। यह वही क्लिपिंग प्रभाव है। वास्तव में पुस्तकालय सिर्फ एक प्रॉक्सी है। आईसीएस पर नाइनऑल्ड एंड्रॉइड सिर्फ उसी विधि को कॉल करते हैं। – user802421

+0

@ user802421 यह मदद कर सकता है: http://stackoverflow.com/q/14415035/350040 – sergio91pt

0

उपयोग ViewGroup.layout। यह स्केल करने का सबसे आसान तरीका हो सकता है (& चाल) ViewGroup।

3

आपके दृश्य के अभिभावक को संपत्ति android:clipChildren अक्षम होना चाहिए (लेआउट फ़ाइल से या setClipChildren(false) के साथ)।

लेकिन इस विधि के साथ आपको दृश्य क्लिप सीमाओं के बाहर टच ईवेंट नहीं मिलते हैं। आप उन्हें अपनी गतिविधि से भेजकर या कस्टम ViewGroup अभिभावक लिखकर चारों ओर काम कर सकते हैं।

मैं अपने मामले में काम करने के लिए एक अलग हैक का उपयोग कर रहा हूं, यह चाल आपके स्वयं के परिवर्तन मैट्रिक्स को बनाए रखना है। फिर, आपको इसे काम करने के लिए ViewGroup की विधि को अधिभारित करना होगा। उदाहरण के लिए:

@Override 
protected void dispatchDraw(Canvas canvas) { 
    Log.d(TAG, "dispatchDraw " + canvas); 
    canvas.save(); 
    canvas.concat(mMatrix); 
    super.dispatchDraw(canvas); 
    canvas.restore();  
} 


@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    Log.d(TAG, "dispatchTouchEvent " + ev); 
    ev.transform(getInvMatrix()); // 
    return super.dispatchTouchEvent(ev); 

} 

private Matrix getInvMatrix() 
{ 
    if(!mTmpMatIsInvMat) 
     mMatrix.invert(mTmpMat); 
    mTmpMatIsInvMat = true; 
    return mTmpMat; 
} 
+0

आप दृश्य से मैट्रिक्स प्राप्त कर सकते हैं। view.getMatrix() फिर इसे उलटा करें, m.invert (m) और गति ईवेंट को स्केल करने के लिए इसका उपयोग करें। – Tatarize

+0

मैंने नकली विचारों से कुछ अलग-अलग हैक्स की कोशिश की जो कि कच्चे स्पर्श को फिर से रिले किया जो दृश्य मैट्रिक्स द्वारा परिवर्तित हो गया। और एकमात्र चीज जिसने कभी भी सभी हार्डवेयर पर लगातार काम किया है, मेरे पास अपने मैट्रिक्स को बनाए रखना है और इसका उपयोग गतिशीलता, दृश्य और अमान्य आयतों को बदलने के लिए किया जाता है। – Tatarize