অ্যান্ড্রয়েড ক্যানভাস.ড্রেউ টেক্সট


91

আমার একটি ভিউ আছে, আমি অনড্র (ক্যানভাস ক্যানভাস) পদ্ধতিতে ক্যানভাস অবজেক্ট দিয়ে আঁকছি। আমার কোডটি হ'ল:

Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setStyle(Style.FILL);
canvas.drawPaint(paint);

paint.setColor(android.R.color.black);
paint.setTextSize(20);
canvas.drawText("Some Text", 10, 25, paint);

সমস্যাটি হচ্ছে পাঠ্যটি ব্যাকগ্রাউন্ডের মাধ্যমে দেখা যাচ্ছে না, আমি কী ভুল করছি? আমি যদি ক্যানভাস.ড্রেডপেইন্ট (পেইন্ট) এবং পেইন্ট.সেট কালার (android.R.color.black) অপসারণ করি আপনি স্ক্রিনে লেখাটি দেখতে পাচ্ছেন .....

উত্তর:


153

এটি কাজ করেছে, দেখা যাচ্ছে যে android.R.color.black কালার.ব্ল্যাকের মতো নয়। কোডটি এতে পরিবর্তন করা হয়েছে:

Paint paint = new Paint(); 
paint.setColor(Color.WHITE); 
paint.setStyle(Style.FILL); 
canvas.drawPaint(paint); 

paint.setColor(Color.BLACK); 
paint.setTextSize(20); 
canvas.drawText("Some Text", 10, 25, paint); 

এবং এখন সব ঠিকঠাক কাজ করে !!


35
হ্যাঁ. আপনি যদি res/colors.xmlআইডি সহ ফাইলটিতে বর্ণ সংজ্ঞাটি ব্যবহার করতে চান R.color.blackতবে আপনি কেবল আইডি ব্যবহার করতে পারবেন না। আপনি যদি সংস্থানগুলি থেকে প্রকৃত রঙের মানটি পেতে চান তবে ব্যবহার করুনpaint.setColor(getResources().getColor(R.color.black));
ম্যাট গিবসন

কেহ জানেন কিভাবে সঙ্গে Android ক্যানভাস ShapeDrawable টেক্সট আঁকা RectShape ?
LOG_TAG

4
এবং পাঠ্য আকার নির্ধারণের জন্য dpআপনি এটি হিসাবে এটি
এসএমমোসাভি

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

এখানে, অঙ্কনের পাঠ্যসূচিতে ("কিছু পাঠ্য", 10,25, পেইন্ট); এর অর্থ বাম মার্জিনটি 10 ​​এবং শীর্ষের মার্জিনটি 25. আমি কি ঠিক আছি?
যুবরাজ ধোলাকিয়া

37

এটি লক্ষ করা উচিত যে ডকুমেন্টেশনগুলি সরাসরি Layoutনা হয়ে বরং ব্যবহার করার পরামর্শ দেয় Canvas.drawText। একটি ব্যবহার সম্পর্কে আমার সম্পূর্ণ উত্তর StaticLayoutহল এখানে , কিন্তু আমি নিচে একটি সারসংক্ষেপ প্রদান করবে।

String text = "This is some text.";

TextPaint textPaint = new TextPaint();
textPaint.setAntiAlias(true);
textPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
textPaint.setColor(0xFF000000);

int width = (int) textPaint.measureText(text);
StaticLayout staticLayout = new StaticLayout(text, textPaint, (int) width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);
staticLayout.draw(canvas);

এখানে একটি কাস্টম ভিউ প্রসঙ্গে একটি পূর্ণ উদাহরণ:

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

public class MyView extends View {

    String mText = "This is some text.";
    TextPaint mTextPaint;
    StaticLayout mStaticLayout;

    // use this constructor if creating MyView programmatically
    public MyView(Context context) {
        super(context);
        initLabelView();
    }

    // this constructor is used when created from xml
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initLabelView();
    }

    private void initLabelView() {
        mTextPaint = new TextPaint();
        mTextPaint.setAntiAlias(true);
        mTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
        mTextPaint.setColor(0xFF000000);

        // default to a single line of text
        int width = (int) mTextPaint.measureText(mText);
        mStaticLayout = new StaticLayout(mText, mTextPaint, (int) width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);

        // New API alternate
        //
        // StaticLayout.Builder builder = StaticLayout.Builder.obtain(mText, 0, mText.length(), mTextPaint, width)
        //        .setAlignment(Layout.Alignment.ALIGN_NORMAL)
        //        .setLineSpacing(1, 0) // multiplier, add
        //        .setIncludePad(false);
        // mStaticLayout = builder.build();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // Tell the parent layout how big this view would like to be
        // but still respect any requirements (measure specs) that are passed down.

        // determine the width
        int width;
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthRequirement = MeasureSpec.getSize(widthMeasureSpec);
        if (widthMode == MeasureSpec.EXACTLY) {
            width = widthRequirement;
        } else {
            width = mStaticLayout.getWidth() + getPaddingLeft() + getPaddingRight();
            if (widthMode == MeasureSpec.AT_MOST) {
                if (width > widthRequirement) {
                    width = widthRequirement;
                    // too long for a single line so relayout as multiline
                    mStaticLayout = new StaticLayout(mText, mTextPaint, width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);
                }
            }
        }

        // determine the height
        int height;
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightRequirement = MeasureSpec.getSize(heightMeasureSpec);
        if (heightMode == MeasureSpec.EXACTLY) {
            height = heightRequirement;
        } else {
            height = mStaticLayout.getHeight() + getPaddingTop() + getPaddingBottom();
            if (heightMode == MeasureSpec.AT_MOST) {
                height = Math.min(height, heightRequirement);
            }
        }

        // Required call: set width and height
        setMeasuredDimension(width, height);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // do as little as possible inside onDraw to improve performance

        // draw the text on the canvas after adjusting for padding
        canvas.save();
        canvas.translate(getPaddingLeft(), getPaddingTop());
        mStaticLayout.draw(canvas);
        canvas.restore();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.