दिलचस्प पोस्ट
इनसेट को समायोजित करने के लिए यूआईएलबल का आकार बदलना AddEventListener श्रोता फ़ंक्शन को जोड़ने के लिए तर्क कैसे पास करें? संदेश पंप चलने वाले एसटीए थ्रेड में संदेश कैसे पोस्ट करें? .key और .crt फ़ाइलों से .pem फ़ाइल कैसे प्राप्त करें? सी ++ कंसैट दो `कॉन्स्ट char 'स्ट्रिंग लीटरल पृष्ठभूमि कार्यकर्ता को तर्क भेजना? मास्टर के अलावा किसी चीज़ को इंगित करने के लिए GIT दूरस्थ HEAD को बदलें एक सूची में सभी फ़ोल्डर से सभी फाइलों की सूची C # winforms कॉम्बोबोक्स गतिशील स्वत: पूर्ण मैं बैकबोन में एक मॉडल कैसे ला सकता हूं? UITableView अनुभाग हैडर का डिफ़ॉल्ट स्क्रॉलिंग व्यवहार बदलें मैं जावा में एक अभिभावक-अंतिम / बाल-प्रथम क्लासलोडर कैसे बना सकता हूं, या पुराने सीरियल में पहले से ही लोड किए गए पुराने जेर्सस संस्करण को ओवरराइड करने के लिए कैसे करें? मैं स्ट्रिंग में एक बैकस्लैश (\) कैसे लिखूं? डेटमैटम डाटाटिप के लिए डिफ़ॉल्ट मान के रूप में अब सेट करें ()? दो पंक्तियों पर पाठ ओवरफ़्लो एल्हीसिस

एंड्रॉइड टेक्स्टवेव आउटलाइन टेक्स्ट

क्या एक सरल तरीका है कि पाठ को एक काला रूपरेखा बनाने में सक्षम हो? मेरे पास टेक्सव्यूव्यूज है जो अलग-अलग रंग होंगे, परन्तु कुछ रंग मेरी पृष्ठभूमि पर इतनी अच्छी तरह से प्रदर्शित नहीं होते हैं, इसलिए मैं सोच रहा था कि क्या एक काले रंग की रूपरेखा पाने के लिए एक आसान तरीका है या कुछ और जो काम करेगा? मैं एक कस्टम दृश्य बनाने और एक कैनवास बनाने और इस तरह के किसी भी तरह नहीं करना पसंद करूँगा

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड टेक्स्टवेव आउटलाइन टेक्स्ट"

आप पाठ के पीछे एक छाया डाल सकते हैं, जो अक्सर पठनीयता की सहायता कर सकते हैं। अपने हरे रंग के टेक्स्ट पर 50% पारदर्शी काले रंग की छाया के साथ प्रयोग करने का प्रयास करें यह कैसे करें पर जानकारी यहां दी गई है: एंड्रॉइड – टेक्स्ट पर छाया?

वास्तव में पाठ के चारों ओर एक स्ट्रोक जोड़ने के लिए, आपको कुछ और इसमें शामिल करने की आवश्यकता है, जैसे: एंड्रॉइड में मैप-वीउ पर बॉर्डर के साथ आप टेक्स्ट कैसे आकर्षित करते हैं?

तो, बहुत देर हो चुकी है, लेकिन MagicTextView पाठ की रूपरेखाएँ, अन्य चीजों के बीच होगा।

यहां छवि विवरण दर्ज करें

<com.qwerjk.better_text.MagicTextView xmlns:qwerjk="http://schemas.android.com/apk/res/com.qwerjk.better_text" android:textSize="78dp" android:textColor="#ff333333" android:layout_width="fill_parent" android:layout_height="wrap_content" qwerjk:strokeColor="#FFff0000" qwerjk:strokeJoinStyle="miter" qwerjk:strokeWidth="5" android:text="Magic" /> 

नोट: मैंने इसे बनाया, और ओपी से भविष्य यात्रियों की खातिर अधिक पोस्ट कर रहा हूं। यह बॉर्डरलाइन स्पैम है, लेकिन क्या विषय पर है, शायद स्वीकार्य है?

आउटपुट प्रभाव TextView में छाया का उपयोग करके प्राप्त किया जा सकता है:

  android:shadowColor="#000000" android:shadowDx="1.5" android:shadowDy="1.3" android:shadowRadius="1.6" android:text="CCC" android:textAllCaps="true" android:textColor="@android:color/white" 

मैं बस यह पता लगाने की कोशिश कर रहा हूं कि यह कैसे करना है और कोई अच्छी मार्गदर्शिका ऑनलाइन नहीं मिल पाई है लेकिन आखिरकार इसे सोचा था। जैसा कि स्टीव पोमेरॉय ने सुझाव दिया है, आपको कुछ ज्यादा शामिल करना होगा। रेखांकित पाठ प्रभाव प्राप्त करने के लिए, आप पाठ को दो बार आकर्षित करते हैं: एक बार एक मोटी रूपरेखा के साथ और दूसरी बार जब हम मुख्य टेक्स्ट को रूपरेखा पर खींचना चाहते हैं लेकिन, यह काम आसान हो गया है क्योंकि आप एसडीके के साथ दिए गए कोड नमूनों में से एक को आसानी से अनुकूलित कर सकते हैं, अर्थात् आपके एसडीके निर्देशिका में इस नाम के तहत: "/ नमूने / एंड्रॉइड- एपीआईडेमोस / एसआरसी / कॉम / उदाहरण / एंड्रॉइड /apis/view/LabelView.java "। जो यहां एंड्रॉइड डेवलपर की वेबसाइट पर भी पाया जा सकता है ।

आप जो कर रहे हैं उसके आधार पर, यह देखने के लिए बहुत आसान है कि आपको केवल उस कोड में मामूली संशोधन करने की आवश्यकता होगी, जैसे कि टेक्स्टव्यू से विस्तार करने के लिए इसे बदलना आदि। इससे पहले कि मैं इस नमूना की खोज करता हूं, मैंने ओवरराइड करने के लिए भूल गया (माप) (जो आपको एंड्रॉइड डेवलपर वेबसाइट पर "बिल्डिंग कस्टम कॉम्पोनेंट्स" गाइड में उल्लिखित ड्रॉ () के रूप में ओवरराइड करने के अलावा क्या करना चाहिए, जो कि मुझे क्यों परेशानी थी।

एक बार जब आप ऐसा कर लेंगे, तो आप जो कर सकते हैं, वह कर सकते हैं:

 public class TextViewOutline extends TextView { private Paint mTextPaint; private Paint mTextPaintOutline; //add another paint attribute for your outline ... //modify initTextViewOutline to setup the outline style private void initTextViewOutline() { mTextPaint = new Paint(); mTextPaint.setAntiAlias(true); mTextPaint.setTextSize(16); mTextPaint.setColor(0xFF000000); mTextPaint.setStyle(Paint.Style.FILL); mTextPaintOutline = new Paint(); mTextPaintOutline.setAntiAlias(true); mTextPaintOutline.setTextSize(16); mTextPaintOutline.setColor(0xFF000000); mTextPaintOutline.setStyle(Paint.Style.STROKE); mTextPaintOutline.setStrokeWidth(4); setPadding(3, 3, 3, 3); } ... //make sure to update other methods you've overridden to handle your new paint object ... //and finally draw the text, mAscent refers to a member attribute which had //a value assigned to it in the measureHeight and Width methods @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawText(mText, getPaddingLeft(), getPaddingTop() - mAscent, mTextPaintOutline); canvas.drawText(mText, getPaddingLeft(), getPaddingTop() - mAscent, mTextPaint); } 

इसलिए, रेखांकित पाठ प्रभाव प्राप्त करने के लिए, आप पाठ को दो बार आकर्षित करते हैं: एक बार एक मोटी रूपरेखा के साथ और दूसरी बार जब हम मुख्य टेक्स्ट को रूपरेखा पर खींचना चाहते हैं

ढांचा पाठ-छाया का समर्थन करता है लेकिन पाठ की रूपरेखा का समर्थन नहीं करता है लेकिन एक चाल है: छाया कुछ है जो पारभासी है और फीका करता है। समय की एक छाया दोबारा तैयार करें और सभी अल्फा का सारांश मिलेगा और परिणाम एक रूपरेखा है।

एक बहुत सरल कार्यान्वयन TextView को बढ़ाता है और आकर्षित विधि ओवरराइड करता है। हर बार एक ड्रॉ का अनुरोध किया जाता है कि हमारे उपवर्ग 5-10 ड्रॉइंग करता है।

 public class OutlineTextView extends TextView { // Constructors @Override public void draw(Canvas canvas) { for (int i = 0; i < 5; i++) { super.draw(canvas); } } } <OutlineTextView android:shadowColor="#000" android:shadowRadius="3.0" /> 

यह काफी पुराना सवाल है, लेकिन फिर भी मुझे कोई पूरा जवाब नहीं मिला। इसलिए मैं इस समाधान को पोस्ट कर रहा हूं, उम्मीद कर रहा हूं कि इस समस्या से जूझ रहे कोई व्यक्ति उपयोगी हो सकता है। सबसे आसान और सबसे प्रभावी उपाय है कि टेक्स्टव्यू क्लास 'ऑन-ड्रॉ विधि को ओवरराइड करना है। अधिकांश क्रियान्वयन मैंने स्ट्रोक को आकर्षित करने के लिए आकर्षित टेक्स्ट का उपयोग करते हुए देखा है लेकिन यह दृष्टिकोण सभी स्वरूपण संरेखण और पाठ लपेटन के लिए खाता नहीं है। और परिणामस्वरूप अक्सर स्ट्रोक और पाठ विभिन्न स्थानों पर समाप्त होता है निम्नलिखित दृष्टिकोण सुपर। का उपयोग करता है स्ट्रोक दोनों को आकर्षित करने और टेक्स्ट के कुछ हिस्सों को भरने के लिए, ताकि आपको बाकी सामानों के बारे में चिंता न करें। ये कदम हैं

  1. टेक्स्टव्यू क्लास बढ़ाएं
  2. ऑन ड्रा विधि को ओवरराइड करें
  3. फ़िल के लिए पेंट स्टाइल सेट करें
  4. भरण मोड में पाठ को प्रस्तुत करने के लिए ड्रा पर पैरेंट क्लास को कॉल करें
  5. मौजूदा पाठ का रंग बचाओ
  6. वर्तमान स्ट्रिंग रंग को अपने स्ट्रोक रंग में सेट करें
  7. स्ट्रोक को रंग शैली सेट करें
  8. स्ट्रोक चौड़ाई सेट करें
  9. और पहले से गाया पाठ पर स्ट्रोक खींचने के लिए फिर से माता-पिता को कॉल करें।

     package com.example.widgets; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Typeface; import android.util.AttributeSet; import android.widget.Button; public class StrokedTextView extends Button { private static final int DEFAULT_STROKE_WIDTH = 0; // fields private int _strokeColor; private float _strokeWidth; // constructors public StrokedTextView(Context context) { this(context, null, 0); } public StrokedTextView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public StrokedTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); if(attrs != null) { TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.StrokedTextAttrs); _strokeColor = a.getColor(R.styleable.StrokedTextAttrs_textStrokeColor, getCurrentTextColor()); _strokeWidth = a.getFloat(R.styleable.StrokedTextAttrs_textStrokeWidth, DEFAULT_STROKE_WIDTH); a.recycle(); } else { _strokeColor = getCurrentTextColor(); _strokeWidth = DEFAULT_STROKE_WIDTH; } //convert values specified in dp in XML layout to //px, otherwise stroke width would appear different //on different screens _strokeWidth = dpToPx(context, _strokeWidth); } // getters + setters public void setStrokeColor(int color) { _strokeColor = color; } public void setStrokeWidth(int width) { _strokeWidth = width; } // overridden methods @Override protected void onDraw(Canvas canvas) { if(_strokeWidth > 0) { //set paint to fill mode Paint p = getPaint(); p.setStyle(Paint.Style.FILL); //draw the fill part of text super.onDraw(canvas); //save the text color int currentTextColor = getCurrentTextColor(); //set paint to stroke mode and specify //stroke color and width p.setStyle(Paint.Style.STROKE); p.setStrokeWidth(_strokeWidth); setTextColor(_strokeColor); //draw text stroke super.onDraw(canvas); //revert the color back to the one //initially specified setTextColor(currentTextColor); } else { super.onDraw(canvas); } } /** * Convenience method to convert density independent pixel(dp) value * into device display specific pixel value. * @param context Context to access device specific display metrics * @param dp density independent pixel value * @return device specific pixel value. */ public static int dpToPx(Context context, float dp) { final float scale= context.getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); } } 

बस इतना ही। यह वर्ग एक्सएमएल लेआउट फाइलों से स्ट्रोक रंग और चौड़ाई निर्दिष्ट करने के लिए कस्टम एक्सएमएल गुण का उपयोग करता है। इसलिए, आपको 'att' फ़ोल्डर के तहत सबफ़ोल्डर 'मान' में अपने attr.xml फ़ाइल में इन विशेषताओं को जोड़ने की आवश्यकता है। अपने attr.xml फ़ाइल में निम्नलिखित को कॉपी और पेस्ट करें।

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="StrokedTextAttrs"> <attr name="textStrokeColor" format="color"/> <attr name="textStrokeWidth" format="float"/> </declare-styleable> </resources> 

एक बार जब आप उसके साथ कर लेंगे, तो आप अपनी XML लेआउट फ़ाइलों में कस्टम StrokedTextView वर्ग का उपयोग कर सकते हैं और स्ट्रोक रंग और चौड़ाई भी निर्दिष्ट कर सकते हैं। यहाँ एक उदाहरण है

 <com.example.widgets.StrokedTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stroked text sample" android:textColor="@android:color/white" android:textSize="25sp" strokeAttrs:textStrokeColor="@android:color/black" strokeAttrs:textStrokeWidth="1.7" /> 

अपने प्रोजेक्ट के पैकेज नाम के साथ पैकेज नाम को बदलने के लिए याद रखें कस्टम XML विशेषताओं का उपयोग करने के लिए लेआउट फ़ाइल में xmlns नामस्थान भी जोड़ें आप अपनी लेआउट फ़ाइल के रूट नोड में निम्नलिखित पंक्ति जोड़ सकते हैं।

 xmlns:strokeAttrs="http://schemas.android.com/apk/res-auto" 

मैंने आउटलाइन के साथ पाठ करने के लिए एक क्लास लिखा है और अभी भी अन्य सभी विशेषताओं का समर्थन किया है और सामान्य टेक्स्ट दृश्य का चित्रण किया है।

यह मूल रूप से super.onDraw(Canves canvas) का उपयोग करता है, लेकिन विभिन्न शैलियों के साथ दो बार खींचता है

उम्मीद है की यह मदद करेगा।

 public class TextViewOutline extends TextView { // constants private static final int DEFAULT_OUTLINE_SIZE = 0; private static final int DEFAULT_OUTLINE_COLOR = Color.TRANSPARENT; // data private int mOutlineSize; private int mOutlineColor; private int mTextColor; private float mShadowRadius; private float mShadowDx; private float mShadowDy; private int mShadowColor; public TextViewOutline(Context context) { this(context, null); } public TextViewOutline(Context context, AttributeSet attrs) { super(context, attrs); setAttributes(attrs); } private void setAttributes(AttributeSet attrs){ // set defaults mOutlineSize = DEFAULT_OUTLINE_SIZE; mOutlineColor = DEFAULT_OUTLINE_COLOR; // text color mTextColor = getCurrentTextColor(); if(attrs != null) { TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.TextViewOutline); // outline size if (a.hasValue(R.styleable.TextViewOutline_outlineSize)) { mOutlineSize = (int) a.getDimension(R.styleable.TextViewOutline_outlineSize, DEFAULT_OUTLINE_SIZE); } // outline color if (a.hasValue(R.styleable.TextViewOutline_outlineColor)) { mOutlineColor = a.getColor(R.styleable.TextViewOutline_outlineColor, DEFAULT_OUTLINE_COLOR); } // shadow (the reason we take shadow from attributes is because we use API level 15 and only from 16 we have the get methods for the shadow attributes) if (a.hasValue(R.styleable.TextViewOutline_android_shadowRadius) || a.hasValue(R.styleable.TextViewOutline_android_shadowDx) || a.hasValue(R.styleable.TextViewOutline_android_shadowDy) || a.hasValue(R.styleable.TextViewOutline_android_shadowColor)) { mShadowRadius = a.getFloat(R.styleable.TextViewOutline_android_shadowRadius, 0); mShadowDx = a.getFloat(R.styleable.TextViewOutline_android_shadowDx, 0); mShadowDy = a.getFloat(R.styleable.TextViewOutline_android_shadowDy, 0); mShadowColor = a.getColor(R.styleable.TextViewOutline_android_shadowColor, Color.TRANSPARENT); } a.recycle(); } PFLog.d("mOutlineSize = " + mOutlineSize); PFLog.d("mOutlineColor = " + mOutlineColor); } private void setPaintToOutline(){ Paint paint = getPaint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(mOutlineSize); super.setTextColor(mOutlineColor); super.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy, mShadowColor); } private void setPaintToRegular() { Paint paint = getPaint(); paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(0); super.setTextColor(mTextColor); super.setShadowLayer(0, 0, 0, Color.TRANSPARENT); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setPaintToOutline(); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override public void setTextColor(int color) { super.setTextColor(color); mTextColor = color; } @Override public void setShadowLayer(float radius, float dx, float dy, int color) { super.setShadowLayer(radius, dx, dy, color); mShadowRadius = radius; mShadowDx = dx; mShadowDy = dy; mShadowColor = color; } public void setOutlineSize(int size){ mOutlineSize = size; } public void setOutlineColor(int color){ mOutlineColor = color; } @Override protected void onDraw(Canvas canvas) { setPaintToOutline(); super.onDraw(canvas); setPaintToRegular(); super.onDraw(canvas); } } 

attr.xml

 <declare-styleable name="TextViewOutline"> <attr name="outlineSize" format="dimension"/> <attr name="outlineColor" format="color|reference"/> <attr name="android:shadowRadius"/> <attr name="android:shadowDx"/> <attr name="android:shadowDy"/> <attr name="android:shadowColor"/> </declare-styleable> 

यहां की चाल मुझे मिली है जो MagicTextView के स्ट्रोक आईएमओ से बेहतर काम करती है I

 @Override protected void onDraw(Canvas pCanvas) { int textColor = getTextColors().getDefaultColor(); setTextColor(mOutlineColor); // your stroke's color getPaint().setStrokeWidth(10); getPaint().setStyle(Paint.Style.STROKE); super.onDraw(pCanvas); setTextColor(textColor); getPaint().setStrokeWidth(0); getPaint().setStyle(Paint.Style.FILL); super.onDraw(pCanvas); } 

तो क्या आप textview के चारों ओर एक स्ट्रोक चाहते हैं? दुर्भाग्य से स्टाइल के साथ ऐसा करने का कोई आसान तरीका नहीं है आपको एक और दृश्य बनाना होगा और अपने टेक्स्ट-ओवर को शीर्ष-स्थान पर रखना होगा, जिससे माता-पिता का दृश्य (जो सबसे ऊपर है) को कुछ पिक्सेल बड़ा करना होगा – यह एक रूपरेखा तैयार करना चाहिए

MagicTextView स्ट्रोक फ़ॉन्ट बनाने के लिए बहुत उपयोगी है, लेकिन मेरे मामले में, यह त्रुटि की वजह से यह त्रुटि दोहराव पृष्ठभूमि विशेषताओं जो MagicTextView

तो आपको attrs.xml और MagicTextView.java को संपादित करना होगा

attrs.xml

 <attr name="background" format="reference|color" /> ↓ <attr name="mBackground" format="reference|color" /> 

MagicTextView.java 88:95

 if (a.hasValue(R.styleable.MagicTextView_mBackground)) { Drawable background = a.getDrawable(R.styleable.MagicTextView_mBackground); if (background != null) { this.setBackgroundDrawable(background); } else { this.setBackgroundColor(a.getColor(R.styleable.MagicTextView_mBackground, 0xff000000)); } } 

मैंने नईमैन हनीफ के जवाब के आधार पर एक लाइब्रेरी बनाई है, जिसमें कुछ अतिरिक्त शामिल हैं। उदाहरण के लिए, एक बग फिक्सिंग करने से, जिसने View.invalidate () कॉल पर अप्रत्यक्ष अनंत लूप का कारण बना दिया था।

ओटोह, लाइब्रेरी भी संपादन टेक्स्ट विजेट में रेखांकित पाठ का समर्थन करती है, क्योंकि यह मेरा असली लक्ष्य था और इसे टेक्स्टव्यू से थोड़ी अधिक काम की जरूरत थी।

यहां मेरी लाइब्रेरी के लिए लिंक है: https://github.com/biomorgoth/android-outline-textview

समाधान पर प्रारंभिक विचार के लिए नूमन हनीफ को धन्यवाद!