অ্যান্ড্রয়েডে উল্লম্ব (ঘোরানো) লেবেল


110

আমার অ্যান্ড্রয়েডে উল্লম্ব লেবেল দেখানোর 2 টি উপায় প্রয়োজন:

  1. অনুভূমিক লেবেলটি 90 ডিগ্রি ঘড়ির কাঁটার বিপরীতে পরিণত হয়েছে (পাশের অক্ষরগুলি)
  2. অন্যটির নিচে অক্ষরের সাথে অনুভূমিক লেবেল (কোনও দোকানের চিহ্ন হিসাবে)

আমার কি উভয় ক্ষেত্রে (এক কেস) কাস্টম উইজেটগুলি বিকাশ করা দরকার, আমি কীভাবে টেক্সটভিউটি রেন্ডার করতে পারি, এবং যদি আমাকে সম্পূর্ণ কাস্টম করার প্রয়োজন হয় তবে এরকম কিছু করার ভাল উপায় কী হবে?


এক্সপিএল 11 এআইপিআই 11 (অ্যান্ড্রয়েড 3.0) হিসাবে এটি করা সম্ভব। stackoverflow.com/questions/3774770/...
chobok

উত্তর:


239

এখানে আমার মার্জিত এবং সাধারণ উলম্ব পাঠ্য বাস্তবায়ন, টেক্সটভিউ প্রসারিত। এর অর্থ হল যে পাঠ্যদর্শন সমস্ত স্ট্যান্ডার্ড শৈলী ব্যবহার করা যেতে পারে, কারণ এটি প্রসারিত পাঠ্যদর্শন iew

public class VerticalTextView extends TextView{
   final boolean topDown;

   public VerticalTextView(Context context, AttributeSet attrs){
      super(context, attrs);
      final int gravity = getGravity();
      if(Gravity.isVertical(gravity) && (gravity&Gravity.VERTICAL_GRAVITY_MASK) == Gravity.BOTTOM) {
         setGravity((gravity&Gravity.HORIZONTAL_GRAVITY_MASK) | Gravity.TOP);
         topDown = false;
      }else
         topDown = true;
   }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
      super.onMeasure(heightMeasureSpec, widthMeasureSpec);
      setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
   }

   @Override
   protected boolean setFrame(int l, int t, int r, int b){
      return super.setFrame(l, t, l+(b-t), t+(r-l));
   }

   @Override
   public void draw(Canvas canvas){
      if(topDown){
         canvas.translate(getHeight(), 0);
         canvas.rotate(90);
      }else {
         canvas.translate(0, getWidth());
         canvas.rotate(-90);
      }
      canvas.clipRect(0, 0, getWidth(), getHeight(), android.graphics.Region.Op.REPLACE);
      super.draw(canvas);
   }
}

ডিফল্টরূপে, ঘোরানো পাঠ্যটি উপরে থেকে নীচে থাকে। যদি আপনি অ্যান্ড্রয়েড সেট করেন: মাধ্যাকর্ষণ = "নীচে", তবে এটি নীচে থেকে উপরে টানা হয়।

প্রযুক্তিগতভাবে এটি টেক্সটভিউটিকে আবর্তিতভাবে আঁকার সময় এটি স্বাভাবিক ঘূর্ণায়মান (কিছু জায়গায় প্রস্থ / উচ্চতা অদলবদল করে) ভাবতে বোকা বানাচ্ছে। এটি একটি এক্সএমএল লেআউটে ব্যবহৃত হওয়ার পরেও সূক্ষ্মভাবে কাজ করে।

সম্পাদনা: অন্য সংস্করণ পোস্ট করা, উপরে অ্যানিমেশনগুলির সাথে সমস্যা রয়েছে। এই নতুন সংস্করণটি আরও ভাল কাজ করে তবে কিছু টেক্সটভিউ বৈশিষ্ট্য হারিয়েছে যেমন মার্কি এবং অনুরূপ বৈশিষ্ট্যগুলি।

public class VerticalTextView extends TextView{
   final boolean topDown;

   public VerticalTextView(Context context, AttributeSet attrs){
      super(context, attrs);
      final int gravity = getGravity();
      if(Gravity.isVertical(gravity) && (gravity&Gravity.VERTICAL_GRAVITY_MASK) == Gravity.BOTTOM) {
         setGravity((gravity&Gravity.HORIZONTAL_GRAVITY_MASK) | Gravity.TOP);
         topDown = false;
      }else
         topDown = true;
   }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
      super.onMeasure(heightMeasureSpec, widthMeasureSpec);
      setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
   }

   @Override
   protected void onDraw(Canvas canvas){
      TextPaint textPaint = getPaint(); 
      textPaint.setColor(getCurrentTextColor());
      textPaint.drawableState = getDrawableState();

      canvas.save();

      if(topDown){
         canvas.translate(getWidth(), 0);
         canvas.rotate(90);
      }else {
         canvas.translate(0, getHeight());
         canvas.rotate(-90);
      }


      canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop());

      getLayout().draw(canvas);
      canvas.restore();
  }
}

সম্পাদনা কোটলিন সংস্করণ:

import android.content.Context
import android.graphics.Canvas
import android.text.BoringLayout
import android.text.Layout
import android.text.TextUtils.TruncateAt
import android.util.AttributeSet
import android.view.Gravity
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.graphics.withSave

class VerticalTextView(context: Context, attrs: AttributeSet) : AppCompatTextView(context, attrs) {
    private val topDown = gravity.let { g ->
        !(Gravity.isVertical(g) && g.and(Gravity.VERTICAL_GRAVITY_MASK) == Gravity.BOTTOM)
    }
    private val metrics = BoringLayout.Metrics()
    private var padLeft = 0
    private var padTop = 0

    private var layout1: Layout? = null

    override fun setText(text: CharSequence, type: BufferType) {
        super.setText(text, type)
        layout1 = null
    }

    private fun makeLayout(): Layout {
        if (layout1 == null) {
            metrics.width = height
            paint.color = currentTextColor
            paint.drawableState = drawableState
            layout1 = BoringLayout.make(text, paint, metrics.width, Layout.Alignment.ALIGN_NORMAL, 2f, 0f, metrics, false, TruncateAt.END, height - compoundPaddingLeft - compoundPaddingRight)
            padLeft = compoundPaddingLeft
            padTop = extendedPaddingTop
        }
        return layout1!!
    }

    override fun onDraw(c: Canvas) {
        //      c.drawColor(0xffffff80); // TEST
        if (layout == null)
            return
        c.withSave {
            if (topDown) {
                val fm = paint.fontMetrics
                translate(textSize - (fm.bottom + fm.descent), 0f)
                rotate(90f)
            } else {
                translate(textSize, height.toFloat())
                rotate(-90f)
            }
            translate(padLeft.toFloat(), padTop.toFloat())
            makeLayout().draw(this)
        }
    }
}

2
আপনার সমাধানটি লিঙ্কগুলিকে অক্ষম করে TextView। প্রকৃতপক্ষে লিঙ্কগুলি আন্ডারলাইন করা হয়েছে, তবে ক্লিকটিতে সাড়া দিচ্ছে না।
গুরনেটকো

5
এটিতে মাল্টলাইন এবং স্ক্রোলবারগুলি রয়েছে।
সিনিচনি বান্দেরা

1
আমার বেসিক প্রশ্নের জন্য দুঃখিত, আমি যদি একটি টেক্সটভিউ পেয়েছি (একটি এক্সএমএল ফাইলে) এবং আমি এটি ঘোরানো চাই, আমাকে কীভাবে ভার্টিকালটেক্সটভিউ ক্লাস কল করতে হবে?
blackst0ne

2
@ ব্ল্যাকস্টেনে <টেক্সটভিউ> ট্যাগগুলির পরিবর্তে, একটি কাস্টম ভিউ ট্যাগ ব্যবহার করুন: <com.YOUR_PACKAGE_NAME. ভার্টিকাল টেক্সটভিউ>
দাইউইক দারুন

1
দুর্দান্ত কাজ করে, আমার ক্ষেত্রে আমাকে আমার শৈলীর বৈশিষ্ট্যটির কাজ করতে টেক্সটভিউয়ের পরিবর্তে অ্যান্ড্রয়েড.সম্পোর্ট.ভি 7.উইজেট.অ্যাপকম্প্যাটটেক্সটভিউটি প্রসারিত করতে হয়েছিল
লুই

32

আমি আমার চার্টড্রয়েড প্রকল্পের জন্য এটি প্রয়োগ করেছি । তৈরি করুন VerticalLabelView.java:

public class VerticalLabelView extends View {
    private TextPaint mTextPaint;
    private String mText;
    private int mAscent;
    private Rect text_bounds = new Rect();

    final static int DEFAULT_TEXT_SIZE = 15;

    public VerticalLabelView(Context context) {
        super(context);
        initLabelView();
    }

    public VerticalLabelView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initLabelView();

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.VerticalLabelView);

        CharSequence s = a.getString(R.styleable.VerticalLabelView_text);
        if (s != null) setText(s.toString());

        setTextColor(a.getColor(R.styleable.VerticalLabelView_textColor, 0xFF000000));

        int textSize = a.getDimensionPixelOffset(R.styleable.VerticalLabelView_textSize, 0);
        if (textSize > 0) setTextSize(textSize);

        a.recycle();
    }

    private final void initLabelView() {
        mTextPaint = new TextPaint();
        mTextPaint.setAntiAlias(true);
        mTextPaint.setTextSize(DEFAULT_TEXT_SIZE);
        mTextPaint.setColor(0xFF000000);
        mTextPaint.setTextAlign(Align.CENTER);
        setPadding(3, 3, 3, 3);
    }

    public void setText(String text) {
        mText = text;
        requestLayout();
        invalidate();
    }

    public void setTextSize(int size) {
        mTextPaint.setTextSize(size);
        requestLayout();
        invalidate();
    }

    public void setTextColor(int color) {
        mTextPaint.setColor(color);
        invalidate();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        mTextPaint.getTextBounds(mText, 0, mText.length(), text_bounds);
        setMeasuredDimension(
                measureWidth(widthMeasureSpec),
                measureHeight(heightMeasureSpec));
    }

    private int measureWidth(int measureSpec) {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        if (specMode == MeasureSpec.EXACTLY) {
            // We were told how big to be
            result = specSize;
        } else {
            // Measure the text
            result = text_bounds.height() + getPaddingLeft() + getPaddingRight();

            if (specMode == MeasureSpec.AT_MOST) {
                // Respect AT_MOST value if that was what is called for by measureSpec
                result = Math.min(result, specSize);
            }
        }
        return result;
    }

    private int measureHeight(int measureSpec) {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        mAscent = (int) mTextPaint.ascent();
        if (specMode == MeasureSpec.EXACTLY) {
            // We were told how big to be
            result = specSize;
        } else {
            // Measure the text
            result = text_bounds.width() + getPaddingTop() + getPaddingBottom();

            if (specMode == MeasureSpec.AT_MOST) {
                // Respect AT_MOST value if that was what is called for by measureSpec
                result = Math.min(result, specSize);
            }
        }
        return result;
    }

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

        float text_horizontally_centered_origin_x = getPaddingLeft() + text_bounds.width()/2f;
        float text_horizontally_centered_origin_y = getPaddingTop() - mAscent;

        canvas.translate(text_horizontally_centered_origin_y, text_horizontally_centered_origin_x);
        canvas.rotate(-90);
        canvas.drawText(mText, 0, 0, mTextPaint);
    }
}

এবং এর মধ্যে attrs.xml:

<resources>
     <declare-styleable name="VerticalLabelView">
        <attr name="text" format="string" />
        <attr name="textColor" format="color" />
        <attr name="textSize" format="dimension" />
    </declare-styleable>
</resources>

খুব দরকারী. এখানে আপনার প্রকল্পের কোড ট্র্যাঙ্কের লিঙ্কটি দেওয়া আছে www.google.com/p/chartdroid/source/browse//trunk/core/…
rd

দরকারী নয়, পাঠ্য সম্পূর্ণরূপে প্রদর্শিত হয় না .. এটি শেষ থেকে শুরু করে শুরু হয়।
সিদ্ধার্থ জি

উপরের অ্যান্ড্রয়েড সংস্করণ ২৮ তেও কাজ করেছেন
অজিত চৌধুরী চৌধুরী

আপনার সংস্করণটি আমার প্রকল্পের জন্য সেরা বিকল্প তবে সেটটেক্সটকালার কাজ করছে না, এছাড়াও আমি একটি স্টাইল প্রয়োগ করতে চাই (ব্যাকগ্রাউন্ড এবং ফন্টফ্যামিলি) এটি করা কি প্রতিক্রিয়াযুক্ত?
পাবলো আর

9

এগুলি অর্জনের একটি উপায় হ'ল:

  1. আপনার নিজস্ব কাস্টম ভিউ লিখুন এবং ড্র (ক্যানভাস) ওভাররাইড করুন।আপনি ক্যানভাসে পাঠ্যটি আঁকতে পারেন এবং তারপরে ক্যানভাসটি ঘোরান।
  2. একই হিসাবে ১. এই সময় ব্যতীত কোনও পথ ব্যবহার করুন এবং আঁকাপাঠপাঠ (...) ব্যবহার করে পাঠ্য আঁকুন

সুতরাং আমি সেই রুটে যাওয়ার আগে (আমি টেক্সটভিউর জন্য ড্র-এর পদ্ধতির দিকে নজর দিয়েছিলাম - এটি বিশাল) আমি লক্ষ্য করেছি যে টেক্সটভিউ এবং বর্ধিত বাটনটির মধ্যে পুরো পার্থক্যটি একটি অভ্যন্তরীণ স্টাইলের আইডি (com.android.intern.R.attr.buttonStyle) সম্ভব হবে কি? কেবল একটি কাস্টম শৈলীর সংজ্ঞা দিতে এবং বোতামের মতো টেক্সটভিউ প্রসারিত করতে? আমি অনুমান করছি যে উত্তরটি উত্তর হবে না কারণ সম্ভবত পাঠ্যটি উল্লম্বভাবে বিন্যাসে স্টাইল করা সম্ভব নয়
বোস্টোন

এই পদ্ধতির আসলে কাজ করে? আমার কোনও সাফল্য নেই এবং এই ছেলেটিও নেই
ntdood

1
২. ড্রটেক্সটঅনপথ () পাঠ্যটি আঁকুন যেমনটি ঘোরানো হয়েছিল, একইভাবে ১. একইভাবে অক্ষরের লেখার জন্য অন্য \nএকটি অক্ষরের পরে ব্যবহার করুন অথবা যদি আপনার নির্দিষ্ট-প্রস্থের ফন্ট থাকে তবে কেবলমাত্র একটি অক্ষরের সাথে মানিয়ে টেক্সটভিউ প্রস্থকে সীমাবদ্ধ করুন।
blob

8

অনুমোদিত উত্তরে ভার্টিকাল টেক্সটভিউ ক্লাসের উভয়কেই চেষ্টা করেছিলেন এবং তারা যুক্তিসঙ্গতভাবে ভালভাবে কাজ করেছিলেন।

তবে আমি যা চেষ্টা করেছি তা বিবেচনা করেই আমি এই ভার্টিক্যাল টেক্সটভিউগুলিকে ধারণকৃত বিন্যাসের (একটি রিলেটিভলয়েট যা একটি রিসাইক্লার ভিউয়ের জন্য স্ফীত আইটেমের একটি অংশ) এর কেন্দ্রে রাখতে পারিনি।

এফডাব্লুআইডাব্লু, চারপাশে দেখার পরে, আমি গিটহাবে yoog568 এর ভার্টিকাল টেক্সটভিউ ক্লাস পেয়েছি:

https://github.com/yoog568/VerticalTextView/blob/master/src/com/yoog/widget/VerticalTextView.java

যা আমি ইচ্ছা অনুযায়ী অবস্থান করতে সক্ষম হয়েছি। আপনার প্রকল্পে আপনাকে নিম্নলিখিত বৈশিষ্ট্য সংজ্ঞাও অন্তর্ভুক্ত করতে হবে:

https://github.com/yoog568/VerticalTextView/blob/master/res/values/attr.xml


1
আমি এই বাস্তবায়নটি সত্যিই সহজ বলে মনে করেছি!
হাশিম আক্তার

4
check = (TextView)findViewById(R.id.check);
check.setRotation(-90);

এটি আমার পক্ষে কাজ করেছে, ঠিক আছে। উল্লম্বভাবে অক্ষরগুলি নেমে যাওয়ার জন্য - আমি জানি না।


7
এমনকি এটি স্থানটি অনুভূমিকভাবে নেয় এবং এটি উল্লম্বভাবে ঘোরান
প্রব

3

কিছু ছোটখাটো বিষয়ও মনোযোগ দেওয়া দরকার।

ঘোরানো বা পথের পথগুলি বেছে নেওয়ার সময় এটি চরসেটের উপর নির্ভর করে। উদাহরণস্বরূপ, যদি লক্ষ্য অক্ষরটি ইংরাজির মতো হয় এবং প্রত্যাশিত প্রভাবটি দেখে মনে হয়,

a
b
c
d

আপনি প্রতিটি চরিত্র এক এক করে অঙ্কন করে এই প্রভাবটি পেতে পারেন, কোনও ঘোরানো বা পাথের প্রয়োজন নেই।

এখানে চিত্র বর্ণনা লিখুন

এই প্রভাবটি পেতে আপনার ঘোরানো বা পথের প্রয়োজন হতে পারে।

মুশকিল অংশটি যখন আপনি মঙ্গোলিয়ের মতো চরসেটটি দেওয়ার চেষ্টা করেন। টাইপফেসের গ্লাইফটি 90 ডিগ্রি ঘোরানো দরকার, সুতরাং ড্রটেক্সটনপ্যাথ () ব্যবহারের জন্য ভাল প্রার্থী হবে।


বাম পাশ থেকে রাইটসাইডে অন্য পথ দিয়ে কীভাবে এটি করা যায়
রাকেশ

3
Textview.setTextDirection (View.TEXT_DIRECTION_RTL) বা Textview.setTextDirection (View.TEXT_DIRECTION_ANY_RTL) এপিআই স্তরের 17 এর উপরে কাজ করতে পারে you আপনি এটি পরীক্ষা করতে পারেন।
Zephyr

স্মার্ট এবং সাধারণ
আবদুল্লাহমান আবদেলকদারের

1

পয়েন্টার নুলের উত্তর অনুসরণ করে , আমি onDrawপদ্ধতিটি এইভাবে পরিবর্তন করে অনুভূমিকভাবে পাঠ্যটি কেন্দ্র করতে সক্ষম হয়েছি :

@Override
protected void onDraw(Canvas canvas){
    TextPaint textPaint = getPaint();
    textPaint.setColor(getCurrentTextColor());
    textPaint.drawableState = getDrawableState();
    canvas.save();
    if(topDown){
        canvas.translate(getWidth()/2, 0);
        canvas.rotate(90);
    }else{
        TextView temp = new TextView(getContext());
        temp.setText(this.getText().toString());
        temp.setTypeface(this.getTypeface());
        temp.measure(0, 0);
        canvas.rotate(-90);
        int max = -1 * ((getWidth() - temp.getMeasuredHeight())/2);
        canvas.translate(canvas.getClipBounds().left, canvas.getClipBounds().top - max);
    }
    canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop());
    getLayout().draw(canvas);
    canvas.restore();
}

একটি মাল্টিলিনযুক্ত পাঠ্য কেন্দ্রীভূত করতে আপনার পাঠ্যদর্শন মাপাউথের একটি অংশ যুক্ত করার প্রয়োজন হতে পারে।


1

আপনি কেবল আপনার টেক্সটভিউ বা অন্যান্য ভিউ এক্সএমএল রোটেশন মান যুক্ত করতে পারেন। এটি আমার পক্ষে সহজ কাজ এবং সঠিক কাজ।

<LinearLayout
    android:rotation="-90"
    android:layout_below="@id/image_view_qr_code"
    android:layout_above="@+id/text_view_savva_club"
    android:layout_marginTop="20dp"
    android:gravity="bottom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

   <TextView
       android:textColor="@color/colorPrimary"
       android:layout_marginStart="40dp"
       android:textSize="20sp"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Дмитриевский Дмитрий Дмитриевич"
       android:maxLines="2"
       android:id="@+id/vertical_text_view_name"/>
    <TextView
        android:textColor="#B32B2A29"
        android:layout_marginStart="40dp"
        android:layout_marginTop="15dp"
        android:textSize="16sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/vertical_text_view_phone"
        android:text="+38 (000) 000-00-00"/>

</LinearLayout>

ফলাফল


0

উল্লম্ব লিনিয়ারলআউটের অভ্যন্তরে উল্লম্ব পাঠটি রেন্ডারিংয়ের আমার প্রাথমিক পন্থাটি নিম্নরূপ ছিল (এটি জাভা ব্যবহারে কোটলিন, setRoatationইত্যাদি):

val tv = TextView(context)
tv.gravity = Gravity.CENTER
tv.rotation = 90F
tv.height = calcHeight(...)
linearLabels.addView(tv)

পন্থা # 1

আপনি দেখতে পাচ্ছেন যে সমস্যাটি টেক্সটভিউটি উল্লম্বভাবে চলে যায় তবে তবুও এর প্রস্থকে এমনভাবে আচরণ করে যেন এটি অনুভূমিকভাবে কেন্দ্রিক হয়েছিল! = /

সুতরাং এটির জন্য অ্যাকাউন্ট # 2 এ অতিরিক্তভাবে প্রস্থ এবং উচ্চতা স্যুইচ করা সমন্বিত:

tv.measure(0, 0)
// tv.setSingleLine()
tv.width = tv.measuredHeight
tv.height = calcHeight(...)

পন্থা # 2

এটির ফলস্বরূপ setSingleLineঅপেক্ষাকৃত সংক্ষিপ্ত প্রস্থের পরে লেবেলগুলি পরের লাইনে মোড়ানো (বা আপনি যদি ক্রপ হয়ে যাচ্ছেন ) in আবার, এইটিকে y এর সাথে বিভ্রান্ত করার জন্য উত্সাহিত হয়।

আমার # 3 পদ্ধতির বিষয়টি এইভাবে একটি রিলেটিভলয়েটে টেক্সটভিউটি মোড়ানো ছিল। ধারণাটি হ'ল টেক্সটভিউটিকে যে-প্রস্থটি চান সেটি প্রসারিত করে এটি বাম এবং ডানদিকে প্রসারিত করে (এখানে, উভয় দিকে 200 পিক্সেল)। তবে আমি এটি সংকীর্ণ কলাম হিসাবে আঁকা নিশ্চিত করার জন্য রিলেটিভলআউট নেতিবাচক মার্জিন দিই। এই স্ক্রিনশটের জন্য আমার সম্পূর্ণ কোডটি এখানে:

val tv = TextView(context)
tv.text = getLabel(...)
tv.gravity = Gravity.CENTER
tv.rotation = 90F

tv.measure(0, 0)
tv.width = tv.measuredHeight + 400  // 400 IQ
tv.height = calcHeight(...)

val tvHolder = RelativeLayout(context)
val lp = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT)
lp.setMargins(-200, 0, -200, 0)
tvHolder.layoutParams = lp
tvHolder.addView(tv)
linearLabels.addView(tvHolder)

val iv = ImageView(context)
iv.setImageResource(R.drawable.divider)
linearLabels.addView(iv)

যোগাযোগ # 3

একটি সাধারণ টিপ হিসাবে, অন্য দৃষ্টিভঙ্গিকে "হোল্ড" রাখার এই কৌশলটি অ্যান্ড্রয়েডে জিনিসগুলির অবস্থান নির্ধারণে আমার পক্ষে সত্যই কার্যকর হয়েছে! উদাহরণস্বরূপ, অ্যাকশনবারের নীচে তথ্য উইন্ডো একই কৌশল ব্যবহার করে!

স্টোর চিহ্নের মতো পাঠ্য উপস্থিত হওয়ার জন্য প্রতিটি অক্ষরের পরে নতুন লাইন inোকান, উদাহরণস্বরূপ "N\nu\nt\ns":

স্টোর সাইন উদাহরণ


-1

আমি @ কোস্টমো এর পদ্ধতি পছন্দ করেছি আমি এটি কিছুটা সংশোধন করেছি, কারণ আমার একটি সমস্যা ছিল - যখন আমি এর প্যারামগুলি সেট করি তখন উল্লম্বভাবে ঘোরানো লেবেল কেটে ফেলা হয় WRAP_CONTENT। সুতরাং, একটি পাঠ্য সম্পূর্ণরূপে দৃশ্যমান ছিল না।

এইভাবে আমি এটি সমাধান করেছি:

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.os.Build;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class VerticalLabelView extends View
{
    private final String LOG_TAG           = "VerticalLabelView";
    private final int    DEFAULT_TEXT_SIZE = 30;
    private int          _ascent           = 0;
    private int          _leftPadding      = 0;
    private int          _topPadding       = 0;
    private int          _rightPadding     = 0;
    private int          _bottomPadding    = 0;
    private int          _textSize         = 0;
    private int          _measuredWidth;
    private int          _measuredHeight;
    private Rect         _textBounds;
    private TextPaint    _textPaint;
    private String       _text             = "";
    private TextView     _tempView;
    private Typeface     _typeface         = null;
    private boolean      _topToDown = false;

    public VerticalLabelView(Context context)
    {
        super(context);
        initLabelView();
    }

    public VerticalLabelView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        initLabelView();
    }

    public VerticalLabelView(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        initLabelView();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public VerticalLabelView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
    {
        super(context, attrs, defStyleAttr, defStyleRes);
        initLabelView();
    }

    private final void initLabelView()
    {
        this._textBounds = new Rect();
        this._textPaint = new TextPaint();
        this._textPaint.setAntiAlias(true);
        this._textPaint.setTextAlign(Paint.Align.CENTER);
        this._textPaint.setTextSize(DEFAULT_TEXT_SIZE);
        this._textSize = DEFAULT_TEXT_SIZE;
    }

    public void setText(String text)
    {
        this._text = text;
        requestLayout();
        invalidate();
    }

    public void topToDown(boolean topToDown)
    {
        this._topToDown = topToDown;
    }

    public void setPadding(int padding)
    {
        setPadding(padding, padding, padding, padding);
    }

    public void setPadding(int left, int top, int right, int bottom)
    {
        this._leftPadding = left;
        this._topPadding = top;
        this._rightPadding = right;
        this._bottomPadding = bottom;
        requestLayout();
        invalidate();
    }

    public void setTextSize(int size)
    {
        this._textSize = size;
        this._textPaint.setTextSize(size);
        requestLayout();
        invalidate();
    }

    public void setTextColor(int color)
    {
        this._textPaint.setColor(color);
        invalidate();
    }

    public void setTypeFace(Typeface typeface)
    {
        this._typeface = typeface;
        this._textPaint.setTypeface(typeface);
        requestLayout();
        invalidate();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        try
        {
            this._textPaint.getTextBounds(this._text, 0, this._text.length(), this._textBounds);

            this._tempView = new TextView(getContext());
            this._tempView.setPadding(this._leftPadding, this._topPadding, this._rightPadding, this._bottomPadding);
            this._tempView.setText(this._text);
            this._tempView.setTextSize(TypedValue.COMPLEX_UNIT_PX, this._textSize);
            this._tempView.setTypeface(this._typeface);

            this._tempView.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

            this._measuredWidth = this._tempView.getMeasuredHeight();
            this._measuredHeight = this._tempView.getMeasuredWidth();

            this._ascent = this._textBounds.height() / 2 + this._measuredWidth / 2;

            setMeasuredDimension(this._measuredWidth, this._measuredHeight);
        }
        catch (Exception e)
        {
            setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
            Log.e(LOG_TAG, Log.getStackTraceString(e));
        }
    }

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

        if (!this._text.isEmpty())
        {
            float textHorizontallyCenteredOriginX = this._measuredHeight / 2f;
            float textHorizontallyCenteredOriginY = this._ascent;

            canvas.translate(textHorizontallyCenteredOriginY, textHorizontallyCenteredOriginX);

            float rotateDegree = -90;
            float y = 0;

            if (this._topToDown)
            {
                rotateDegree = 90;
                y = this._measuredWidth / 2;
            }

            canvas.rotate(rotateDegree);
            canvas.drawText(this._text, 0, y, this._textPaint);
        }
    }
}

আপনি যদি উপরে থেকে নীচে কোনও পাঠ্য রাখতে চান তবে topToDown(true)পদ্ধতিটি ব্যবহার করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.