2017-04-01 12 views
7

मैं अपनी खुद की मंगोलियाई वर्टिकल स्क्रिप्ट TextView (और EditText) स्क्रैच से View बढ़ाकर बना रहा हूं। मैं यह समझने की कोशिश कर रहा हूं कि Android TextView source code में चमकते कर्सर को कैसे कार्यान्वित किया गया है। ऐसा लगता है कि mEditorEditor class के उदाहरण से संभाला जा रहा है।एंड्रॉइड एडिटटेक्स्ट (टेक्स्ट व्यू) ब्लिंकिंग कर्सर कैसे आकर्षित करता है?

private void drawCursor(Canvas canvas, int cursorOffsetVertical) { 
    final boolean translate = cursorOffsetVertical != 0; 
    if (translate) canvas.translate(0, cursorOffsetVertical); 
    for (int i = 0; i < mCursorCount; i++) { 
     mCursorDrawable[i].draw(canvas); 
    } 
    if (translate) canvas.translate(0, -cursorOffsetVertical); 
} 

जाहिर है, कर्सर ही किसी प्रकार की एक Drawable है: उस वर्ग में मैं एक drawCursor विधि पाया।

तो मुझे टुकड़े मिल रहे हैं, लेकिन मैं पेड़ के माध्यम से जंगल नहीं देख सकता। क्या कोई ऐसा व्यक्ति जो मुझे इससे बेहतर समझता है, मुझे सादे अंग्रेजी में बता सकता है कि चमकते कर्सर कैसे काम करता है? TextView (या EditText) को

  • कर्सर के रिश्ते, Layout, Editor, और Drawable:

    यहाँ मैं वास्तव में समझ में नहीं आता कुछ विशेष बातें बताई गई हैं।

  • हर बार कर्सर ब्लिंक हो जाता है, क्या सभी पाठ को फिर से खींचा जा रहा है या केवल कर्सर क्षेत्र है?

नोट:

स्वीकार किए जाते हैं जवाब मेरे सवाल का जवाब के रूप में मैं यह पूछा। हालांकि, अगर कोई और अधिक कैनोलिक जोड़ सकता है तो मुझे एक अलग जवाब स्वीकार करने में खुशी होगी जो चीजों को और विस्तार से बताता है।

उत्तर

10
  1. EditText सिर्फ संपादन योग्य TextView, Layout माप, गणना, कहाँ और कैसे पाठ बाहर रखी जाएगा के लिए प्रयोग किया जाता है। Drawable कर्सर को देखने के लिए बस है, बाद में Canvas पर खींचा जा रहा है।
  2. केवल कर्सर Pathinvalidated है।

मूल रूप से ब्लिंक करती है कि एक Handler हर 500ms (अनुमान लगा), ऑन-ऑफ फैशन में कार्यान्वित करता है, और जब तक EditText ध्यान केंद्रित किया यह फिर से निर्धारित किया जाता है पुनरावर्ती Runnable है। यह भी पूर्णांक, जहां कर्सर drawable अल्फा 0 और 255 के बीच टॉगल किया जा जाएगा की ValueAnimator पाशन द्वारा प्राप्त किया जा सकता

+3

चाल यह GitHub में विशिष्ट कोड लाइनों से जोड़ने के लिए अपने आप में एक उथल-पुथल लायक! – Suragch

1

आप this method in the TextView class पा सकते हैं:

public void setCursorVisible(boolean visible) { 

    if (visible && mEditor == null) return; // visible is the default value with no edit data 
    createEditorIfNeeded(); 
    if (mEditor.mCursorVisible != visible) { 
     mEditor.mCursorVisible = visible; 
     invalidate(); 

     mEditor.makeBlink(); 

     // InsertionPointCursorController depends on mCursorVisible 
     mEditor.prepareCursorControllers(); 
    } 
} 
संबंधित मुद्दे