গোলাকার কোণ দিয়ে কীভাবে লেআউট তৈরি করবেন ..?


516

বৃত্তাকার কোণগুলি দিয়ে আমি কীভাবে একটি বিন্যাস তৈরি করতে পারি? আমি আমার উপর বৃত্তাকার কোণ প্রয়োগ করতে চান LinearLayout


কোণার সাথে অঙ্কনযোগ্য একটি আকার তৈরি করুন তারপরে পটভূমি হিসাবে সেট করুন .. সমস্যা কোথায়?
স্টাইনপাইক

আপনার কেবল
গোলাকৃত

আপনাকে কেবল এসও অনুসন্ধান করতে হবে ... আপনি অনেকগুলি আসমান খুঁজে পাবেন ..
পঙ্কজ কুমার

কোণগুলি আমার জন্য অস্পষ্ট
ফিলিটি_উইজার্ড

উত্তর:


1028

1: অঙ্কনযোগ্যগুলিতে বিন্যাস_বিজি.এক্সএমএল সংজ্ঞায়িত করুন :

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"/>
    <stroke android:width="3dp" android:color="#B1BCBE" />
    <corners android:radius="10dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

2: layout_bg.xmlআপনার লেআউটে ব্যাকগ্রাউন্ড হিসাবে যুক্ত করুন

android:background="@drawable/layout_bg"

194
এটি কাজ করে না। যেমনটি আপনি সেট করেছেন, এটি ব্যাকগ্রাউন্ড, সুতরাং সামগ্রীটি বৃত্তাকার কোণগুলিকে ওভাররাইড করে এবং আপনার কোণে আঁকা এমন সামগ্রী থাকলে আপনি সেগুলি বৃত্তাকার হয়ে উঠতে দেখবেন না।
অ্যান্ড্রয়েড বিকাশকারী

22
প্রায় সর্বদা, আমার লিখিত সামগ্রী কখনই কোণগুলি আবরণ করে না। এটি পুরোপুরি কাজ করে।
ডেভিড জেওয়াই তাং

2
কীভাবে ত্রুটি এড়ানো যায় Element shape doesn't have the required attribute android:layout_height?
লরেঞ্জ

2
Element shape doesn't have the required attribute android:layout_heightত্রুটিটি দেখানোর কারণ লেআউট_বিজি.এক্সএমএল অঙ্কনযোগ্য ফোল্ডারের ভিতরে ছিল না।
অতুল

8
@ এনহাউজার 9: আসলে এটি "এটি কাজ করে তবে এটির সতর্কতা অবলম্বন করুন যে আপনার অগ্রভাগ / বিষয়বস্তু কোণে আঁকতে পারে"। সুতরাং ব্যবহারের ক্ষেত্রে এটি 100% কাজ করতে পারে তার উপর নির্ভর করে। আমি খুশি হলাম যে উত্তরটি এতগুলি ডাউনভোট ছিল না কারণ এটি কার্যকর, এবং আমি আনন্দিত যে মন্তব্যে একশটি উর্ধ্বতন রয়েছে কারণ এই সমাধানটির সাথে সীমাবদ্ধতা চিহ্নিত করা সহজ। দুই ভুবনের সেরা.
বেনোইট ডাফেজ

124

21++ এর জন্য, ক্লিপ দর্শন ব্যবহার করুন

বৃত্তাকার আউটলাইন ক্লিপিং Viewএপিআই 21- এ শ্রেণিতে যুক্ত করা হয়েছিল more আরও তথ্যের জন্য এই প্রশিক্ষণ ডক বা এই রেফারেন্সটি দেখুন।

এই অন্তর্নির্মিত বৈশিষ্ট্যটি বৃত্তাকার কোণগুলি কার্যকর করা খুব সহজ করে তোলে। এটি যে কোনও ভিউ বা বিন্যাসে কাজ করে এবং যথাযথ ক্লিপিং সমর্থন করে।

করণীয় এখানে:

  • একটি বৃত্তাকার আকৃতি আঁকতে সক্ষম তৈরি করুন এবং এটি আপনার দর্শনের পটভূমি হিসাবে সেট করুন: android:background="@drawable/round_outline"
  • ডকুমেন্টেশন অনুসারে, আপনার যা করতে হবে তা হ'ল: android:clipToOutline="true"

দুর্ভাগ্যক্রমে, একটি বাগ রয়েছে বলে মনে হচ্ছে এবং এই এক্সএমএল বৈশিষ্ট্যটি বর্তমানে স্বীকৃত নয়। ভাগ্যক্রমে, আমরা জাভাতে ক্লিপিং সেট করতে পারি:

  • আপনার ক্রিয়াকলাপ বা খণ্ডে: View.setClipToOutline(true)

এটা কিসের মত দেখতে:

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

ইমেজভিউ সম্পর্কে বিশেষ দ্রষ্টব্য

setClipToOutline()শুধুমাত্র তখনই কাজ করা হয় যখন ভিউ এর পটভূমি একটি আকার আঁকতে সেট করা হয়। যদি এই ব্যাকগ্রাউন্ড শেপটি বিদ্যমান থাকে, দেখুন ক্লিপিং এবং শেডিংয়ের উদ্দেশ্যে পটভূমির বাহ্যরেখাটিকে সীমানা হিসাবে বিবেচনা করে।

এর অর্থ হ'ল আপনি যদি ইমেজভিউতে কোণগুলি দিয়ে গোল করতে চান তবে setClipToOutline()আপনার চিত্রটি অবশ্যই এর android:srcপরিবর্তে আসতে হবে android:background(যেহেতু ব্যাকগ্রাউন্ডটি গোলাকার আকারের জন্য ব্যবহৃত হয়)। আপনি যদি src এর পরিবর্তে নিজের চিত্র সেট করতে পটভূমি ব্যবহার করেন তবে আপনি এই নেস্টেড ভিউগুলি ব্যবহার করতে পারবেন:

  • আপনার আকৃতির আঁকতে এটির ব্যাকগ্রাউন্ড সেট করে একটি বাহ্যিক বিন্যাস তৈরি করুন
  • আপনার ইমেজভিউয়ের চারপাশে সেই বিন্যাসটি মোড়ানো (কোনও প্যাড ছাড়াই)
  • ইমেজভিউ (লেআউটের অন্য কিছু সহ) এখন বাইরের বিন্যাসের বৃত্তাকার আকারে ক্লিপ হবে।

9
21-এরও কম এপিআই-তে কাজ করে না I যতক্ষণ না কেবলমাত্র আমি 21
এআইপি

'SetClipToOutline' ব্যবহার করে কাজ করে, তবে এটি ফ্রেমটি নিজেই সরিয়ে দেয় (পটভূমির জন্য আপনি ব্যবহারযোগ্য অঙ্কনযোগ্য)। এটি এড়ানোর কোনও উপায় আছে কি?
অ্যান্ড্রয়েড বিকাশকারী

আপনি কি src=@drawable...পরিবর্তে আমার ব্যবহার সম্পর্কে নোট পড়েছেন background=@drawable? আপনি হয় তা করতে পারেন বা একটি চিত্র ধারকের ভিতরে বাসা বাঁধতে পারেন যা আকারের বাহ্যরেখা ধারণ করে।
ক্ষুধার্ত

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

কীভাবে এই বাগটি এখনও ঠিক করা যায় না
পি ফুস্টার

74

একটি সাদা ব্যাকগ্রাউন্ড, কালো সীমানা এবং বৃত্তাকার কোণগুলির সাথে একটি অঙ্কনযোগ্য তৈরি করতে এখানে একটি এক্সএমএল ফাইলের একটি অনুলিপি রয়েছে:

 <?xml version="1.0" encoding="UTF-8"?> 
    <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
        <solid android:color="#ffffffff"/>    

        <stroke android:width="3dp"
                android:color="#ff000000"
                />

        <padding android:left="1dp"
                 android:top="1dp"
                 android:right="1dp"
                 android:bottom="1dp"
                 /> 

        <corners android:bottomRightRadius="7dp" android:bottomLeftRadius="7dp" 
         android:topLeftRadius="7dp" android:topRightRadius="7dp"/> 
    </shape>

এটি অঙ্কনযোগ্য ডিরেক্টরিতে একটি এক্সএমএল ফাইল হিসাবে সংরক্ষণ করুন, এটির মতো ব্যবহার করুন যেমন আপনি কোনও অঙ্কনযোগ্য পটভূমি (আইকন বা রিসোর্স ফাইল) এর সংস্থার নাম ব্যবহার করে (আর।


5
নির্দিষ্ট
বুধবার

1
এই উত্তরটি উপরের মতই বেশ উত্তর। এখানে একমাত্র আসল পরিবর্তনটি প্রতিটি কোণার ব্যাসার্ধের সংজ্ঞা, এবং প্রতিটি কোণার জন্য এটির একই মান দেওয়া হলেও আমি এটির পরিবর্তে এটি একটি লাইনে লিখতে <corners android:radius="7dp" />
চাইতাম

এটি আমার পক্ষে সেরা উত্তর, কারণ এটি নির্দিষ্ট কোণগুলির গোলাকার প্রাপ্যতাটি জুড়ে ... ভাল কাজ, 100% কাজ করে
মাহমুদ আয়মান

ইমেজভিউয়ের কোণগুলি বৃত্তাকার নয় (ক্লিপড), কীভাবে আমি এটি সমাধান করব?
প্রিমো ক্রলজ

এখনও সেপ্টেম্বর 2019 এ কাজ করে।
নিকোলাস Rieble

36

অ্যান্ড্রয়েড ভি 7 সমর্থন লাইব্রেরিতে কার্ডভিউ ব্যবহার করুন। যদিও এটি কিছুটা ভারী, এটি সমস্ত সমস্যা সমাধান করে এবং যথেষ্ট সহজ। সেট অঙ্কনযোগ্য পটভূমি পদ্ধতির মতো নয়, এটি সাবভিউগুলি সফলভাবে ক্লিপ করতে পারে।

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardBackgroundColor="@android:color/transparent"
    card_view:cardCornerRadius="5dp"
    card_view:cardElevation="0dp"
    card_view:contentPadding="0dp">
    <YOUR_LINEARLAYOUT_HERE>
</android.support.v7.widget.CardView>

2
এটি যে কোনও কিছুর চেয়ে "সামর্থ" করতে পারে এমন প্রত্যেকের পক্ষে অনেক বেশি ভাল। এটি আমাকে অবাক করে দেয় যে এই জাতীয় প্রাথমিক জিনিসটি প্রায় কোনও ওয়েব ব্রাউজারের
বেন ফিলিপ

29

আমি এইভাবে করেছি:

স্ক্রিনশট পরীক্ষা করুন:

আপেক্ষিক বিন্যাস পটভূমি

তৈরি করুন অঙ্কনযোগ্য সঙ্গে নামের ফাইল custom_rectangle.xmlমধ্যে অঙ্কনযোগ্য ফোল্ডার:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="@android:color/white" />

    <corners android:radius="10dip" />

    <stroke
        android:width="1dp"
        android:color="@android:color/white" />

</shape>

এখন ভিউতে আয়তক্ষেত্রের পটভূমি প্রয়োগ করুন :

mView.setBackground(R.drawlable.custom_rectangle);

সম্পন্ন


14
এটি কাজ করে না। যেমনটি আপনি সেট করেছেন, এটি ব্যাকগ্রাউন্ড, সুতরাং সামগ্রীটি বৃত্তাকার কোণগুলিকে ওভাররাইড করে এবং আপনার কোণে আঁকানো সামগ্রী থাকলে আপনি সেগুলি বৃত্তাকার হয়ে যাবেন না।
অ্যান্ড্রয়েড বিকাশকারী

25

আমি মনে করি এটি করার একটি আরও ভাল উপায় হ'ল 2 টি জিনিস একত্রিত করা:

  1. এখানে প্রদর্শিত হিসাবে লেআউটটির একটি বিটম্যাপ তৈরি করুন

  2. হিসাবে দেখানো বিটম্যাপ থেকে একটি বৃত্তাকার অঙ্কনযোগ্য করতে, এখানে

  3. একটি চিত্রভিউতে অঙ্কনযোগ্য সেট করুন।

এটি অন্যান্য সমাধানগুলি সমাধান করতে ব্যর্থ হয়েছে এমন কেসগুলি পরিচালনা করবে যেমন কোণায় থাকা সামগ্রী রয়েছে।

আমি মনে করি এটি আরও কিছুটা জিপিইউ-বান্ধব, কারণ এটি 2 এর পরিবর্তে একক স্তর দেখায়।

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

এটি কীভাবে করা যায় তার একটি স্নিপেট এখানে দেওয়া হয়েছে:

RoundedCornersDrawable.java

/**
 * shows a bitmap as if it had rounded corners. based on :
 * http://rahulswackyworld.blogspot.co.il/2013/04/android-drawables-with-rounded_7.html
 * easy alternative from support library: RoundedBitmapDrawableFactory.create( ...) ; 
 */
public class RoundedCornersDrawable extends BitmapDrawable {

    private final BitmapShader bitmapShader;
    private final Paint p;
    private final RectF rect;
    private final float borderRadius;

    public RoundedCornersDrawable(final Resources resources, final Bitmap bitmap, final float borderRadius) {
        super(resources, bitmap);
        bitmapShader = new BitmapShader(getBitmap(), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        final Bitmap b = getBitmap();
        p = getPaint();
        p.setAntiAlias(true);
        p.setShader(bitmapShader);
        final int w = b.getWidth(), h = b.getHeight();
        rect = new RectF(0, 0, w, h);
        this.borderRadius = borderRadius < 0 ? 0.15f * Math.min(w, h) : borderRadius;
    }

    @Override
    public void draw(final Canvas canvas) {
        canvas.drawRoundRect(rect, borderRadius, borderRadius, p);
    }
}

CustomView.java

public class CustomView extends ImageView {
    private View mMainContainer;
    private boolean mIsDirty=false;

    // TODO for each change of views/content, set mIsDirty to true and call invalidate

    @Override
    protected void onDraw(final Canvas canvas) {
        if (mIsDirty) {
            mIsDirty = false;
            drawContent();
            return;
        }
        super.onDraw(canvas);
    }

    /**
     * draws the view's content to a bitmap. code based on :
     * http://nadavfima.com/android-snippet-inflate-a-layout-draw-to-a-bitmap/
     */
    public static Bitmap drawToBitmap(final View viewToDrawFrom, final int width, final int height) {
        // Create a new bitmap and a new canvas using that bitmap
        final Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(bmp);
        viewToDrawFrom.setDrawingCacheEnabled(true);
        // Supply measurements
        viewToDrawFrom.measure(MeasureSpec.makeMeasureSpec(canvas.getWidth(), MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(canvas.getHeight(), MeasureSpec.EXACTLY));
        // Apply the measures so the layout would resize before drawing.
        viewToDrawFrom.layout(0, 0, viewToDrawFrom.getMeasuredWidth(), viewToDrawFrom.getMeasuredHeight());
        // and now the bmp object will actually contain the requested layout
        canvas.drawBitmap(viewToDrawFrom.getDrawingCache(), 0, 0, new Paint());
        return bmp;
    }

    private void drawContent() {
        if (getMeasuredWidth() <= 0 || getMeasuredHeight() <= 0)
            return;
        final Bitmap bitmap = drawToBitmap(mMainContainer, getMeasuredWidth(), getMeasuredHeight());
        final RoundedCornersDrawable drawable = new RoundedCornersDrawable(getResources(), bitmap, 15);
        setImageDrawable(drawable);
    }

}

সম্পাদনা: "রাউন্ডকর্নারলআউটস" লাইব্রেরির উপর ভিত্তি করে একটি দুর্দান্ত বিকল্প পাওয়া গেছে । একটি বৃত্ত রয়েছে যা আপনার প্রসারিত করতে চান এমন লেআউট ক্লাসগুলির জন্য ব্যবহার করা হবে, গোল করা হবে:

//based on https://github.com/JcMinarro/RoundKornerLayouts
class CanvasRounder(cornerRadius: Float, cornerStrokeColor: Int = 0, cornerStrokeWidth: Float = 0F) {
    private val path = android.graphics.Path()
    private lateinit var rectF: RectF
    private var strokePaint: Paint?
    var cornerRadius: Float = cornerRadius
        set(value) {
            field = value
            resetPath()
        }

    init {
        if (cornerStrokeWidth <= 0)
            strokePaint = null
        else {
            strokePaint = Paint()
            strokePaint!!.style = Paint.Style.STROKE
            strokePaint!!.isAntiAlias = true
            strokePaint!!.color = cornerStrokeColor
            strokePaint!!.strokeWidth = cornerStrokeWidth
        }
    }

    fun round(canvas: Canvas, drawFunction: (Canvas) -> Unit) {
        val save = canvas.save()
        canvas.clipPath(path)
        drawFunction(canvas)
        if (strokePaint != null)
            canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, strokePaint)
        canvas.restoreToCount(save)
    }

    fun updateSize(currentWidth: Int, currentHeight: Int) {
        rectF = android.graphics.RectF(0f, 0f, currentWidth.toFloat(), currentHeight.toFloat())
        resetPath()
    }

    private fun resetPath() {
        path.reset()
        path.addRoundRect(rectF, cornerRadius, cornerRadius, Path.Direction.CW)
        path.close()
    }

}

তারপরে আপনার প্রতিটি কাস্টমাইজড লেআউট ক্লাসে এই জাতীয় কোড যুক্ত করুন:

class RoundedConstraintLayout : ConstraintLayout {
    private lateinit var canvasRounder: CanvasRounder

    constructor(context: Context) : super(context) {
        init(context, null, 0)
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        init(context, attrs, 0)
    }

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
        init(context, attrs, defStyle)
    }

    private fun init(context: Context, attrs: AttributeSet?, defStyle: Int) {
        val array = context.obtainStyledAttributes(attrs, R.styleable.RoundedCornersView, 0, 0)
        val cornerRadius = array.getDimension(R.styleable.RoundedCornersView_corner_radius, 0f)
        val cornerStrokeColor = array.getColor(R.styleable.RoundedCornersView_corner_stroke_color, 0)
        val cornerStrokeWidth = array.getDimension(R.styleable.RoundedCornersView_corner_stroke_width, 0f)
        array.recycle()
        canvasRounder = CanvasRounder(cornerRadius,cornerStrokeColor,cornerStrokeWidth)
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
            setLayerType(FrameLayout.LAYER_TYPE_SOFTWARE, null)
        }
    }

    override fun onSizeChanged(currentWidth: Int, currentHeight: Int, oldWidth: Int, oldheight: Int) {
        super.onSizeChanged(currentWidth, currentHeight, oldWidth, oldheight)
        canvasRounder.updateSize(currentWidth, currentHeight)
    }

    override fun draw(canvas: Canvas) = canvasRounder.round(canvas) { super.draw(canvas) }

    override fun dispatchDraw(canvas: Canvas) = canvasRounder.round(canvas) { super.dispatchDraw(canvas) }

}

আপনি যদি বৈশিষ্ট্যগুলি সমর্থন করতে চান তবে এটি লাইব্রেরিতে লিখিত হিসাবে ব্যবহার করুন:

<resources>
  <declare-styleable name="RoundedCornersView">
      <attr name="corner_radius" format="dimension"/>
      <attr name="corner_stroke_width" format="dimension"/>
      <attr name="corner_stroke_color" format="color"/>
  </declare-styleable>
</resources>

অন্য বিকল্প, যা বেশিরভাগ ব্যবহারের পক্ষে সহজ হতে পারে: মেটেরিয়ালকার্ডভিউ ব্যবহার করুন। এটি বৃত্তাকার কোণগুলি, স্ট্রোকের রঙ এবং প্রস্থ এবং উচ্চতাকে কাস্টমাইজ করতে দেয়।

উদাহরণ:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:clipChildren="false" android:clipToPadding="false"
    tools:context=".MainActivity">

    <com.google.android.material.card.MaterialCardView
        android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center"
        app:cardCornerRadius="8dp" app:cardElevation="8dp" app:strokeColor="#f00" app:strokeWidth="2dp">

        <ImageView
            android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0f0"/>

    </com.google.android.material.card.MaterialCardView>

</FrameLayout>

এবং ফলাফল:

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

মনে রাখবেন যে স্ট্রোকের প্রান্তগুলিতে কিছুটা শৈল্পিক সমস্যা রয়েছে (যদি আপনি এটি ব্যবহার করেন তবে সামগ্রীটির কিছু পিক্সেল রেখে দেয়)। আপনি যদি জুম করেন তবে আপনি এটি লক্ষ্য করতে পারেন I've আমি এই সমস্যাটি সম্পর্কে এখানে রিপোর্ট করেছি ।

সম্পাদনা: স্থির হয়ে গেছে বলে মনে হচ্ছে, তবে IDE তে নেই। এখানে রিপোর্ট করা


এই দুর্দান্ত উত্তরটি একত্রিত করার জন্য ধন্যবাদ, এটি আমাকে সঠিক দিকে নিয়ে যাচ্ছিল, তবে আমি এখানে একটি খুব সম্পর্কিত সমস্যার সাথে কিছু সাহায্য ব্যবহার করতে পারি stackoverflow.com/questions/25877515/…
উইল থমসন

ইমেজভিউতে কোনও ডিফল্ট নির্মাতা উপলব্ধ না হওয়ায় এটি ত্রুটি দেয়।
অনুজ

এটি উত্তর গ্রহণ করা উচিত। ফ্ল্যাট যুক্তির পরিবর্তে আপনি নীচে গিয়ে একটি দুর্দান্ত সমাধান খুঁজে পেয়েছেন find এছাড়াও এটি অন্যান্য উত্তরের মন্তব্যে উল্লিখিত সমস্যাগুলি সমাধান করে। আপনার প্রচেষ্টার জন্য ধন্যবাদ এবং সম্ভবত আপনি একটি সম্পূর্ণ ক্রিয়ামূলক শ্রেণীর অধিকার করতে এবং এটি গিথুবের মাধ্যমে ভাগ করতে পারেন। আমি মনে করি এটি খুব বেশি লোককে সাহায্য করতে পারে।
আরদা কারা

@ সেন্সর আপনি কি ভাবেন আমার উচিত? আমি এটি সম্পর্কে চিন্তা করব। আপাতত, আপনি যে অন্যান্য সংগ্রহস্থলগুলি তৈরি করেছেন তা এখানে দেখতে পাবেন: github.com/AndroidDeveloperLB?tab=repositories
অ্যান্ড্রয়েড বিকাশকারী

এটির একটি বড় অংশ হিসাবে আপনি এটি ব্যবহার করে দেখতে পারেন। বিটিডব্লিউ অটোফিটেক্সটভিউ দেখতে সত্যিই দুর্দান্ত।
আরদা কারা

10

এটা চেষ্টা কর...

1 চিত্র অঙ্কনযোগ্য এক্সএমএল তৈরি করুন (কাস্টম_লেআউটআউট.এক্সএমএল):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

<solid android:color="#FFFFFF" />

<stroke
    android:width="2dp"
    android:color="#FF785C" />

<corners android:radius="10dp" />

</shape>

আপনার দর্শনের ব্যাকগ্রাউন্ড যুক্ত করুন

android:background="@drawable/custom_layout"

আমি অনুরূপ সমাধানটির উপরে যেমন লিখেছি: এটি কার্যকর হয় না। যেমনটি আপনি সেট করেছেন, এটি ব্যাকগ্রাউন্ড, সুতরাং সামগ্রীটি বৃত্তাকার কোণগুলিকে ওভাররাইড করে এবং আপনার কোণে আঁকানো সামগ্রী থাকলে আপনি সেগুলি বৃত্তাকার হয়ে যাবেন না।
অ্যান্ড্রয়েড বিকাশকারী

9

আপনি যদি আপনার লেআউটটিকে বৃত্তাকার করতে চান তবে কার্ডভিউ ব্যবহার করা ভাল, এটি নকশাটিকে সুন্দর করতে অনেকগুলি বৈশিষ্ট্য সরবরাহ করেছে।

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="5dp">
      <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".3"
                android:text="@string/quote_code"
                android:textColor="@color/white"
                android:textSize="@dimen/text_head_size" />
      </LinearLayout>
</android.support.v7.widget.CardView>

এই কার্ড_ভিউয়ের সাথে: কার্ডকর্নারডিয়াস = "5 ডিপি", আপনি ব্যাসার্ধ পরিবর্তন করতে পারেন।


5

আপনার লেআউটে কার্ড_ব্যাকগ্রাউন্ড অঙ্কনযোগ্য ব্যবহার করা সবচেয়ে সহজ এবং সহজ পদ্ধতি হবে । এটি গুগলের উপাদান নকশা নির্দেশিকাও অনুসরণ করে। এটি কেবল আপনার মধ্যে অন্তর্ভুক্ত করুন লিনিয়ারলআউট:

android:background="@drawable/card_background"

এটি আপনার আঁকতে সক্ষম ডিরেক্টরিতে যুক্ত করুন এবং নাম দিন ___গ্রাউন্ড.এক্সএমএল :

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="rectangle">
            <solid android:color="#BDBDBD"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>

    <item
        android:left="0dp"
        android:right="0dp"
        android:top="0dp"
        android:bottom="2dp">
        <shape android:shape="rectangle">
            <solid android:color="#ffffff"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>
</layer-list>

5

যে কোনও বিন্যাসের জন্য বৃত্তাকার প্রান্তগুলি পেতে কার্ডভিউ ব্যবহার করুন। ব্যবহারের card_view: cardCornerRadius = "5dp" cardview জন্য বৃত্তাকার বিন্যাস প্রান্ত জন্য।

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:card_view="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">

      <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        card_view:cardCornerRadius="5dp">
          <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:padding="15dp"
                android:weightSum="1">

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight=".3"
                    android:text="@string/quote_code"
                    android:textColor="@color/white"
                    android:textSize="@dimen/text_head_size" />

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight=".7"
                    android:text="@string/quote_details"
                    android:textColor="@color/white"
                    android:textSize="@dimen/text_head_size" />
            </LinearLayout>
       </android.support.v7.widget.CardView>
   </LinearLayout>

সাপোর্ট.ভি 7 লাইব্রেরি থেকে কার্ডভিউ, আপনি API7 বা উচ্চতর থেকে ব্যবহার করতে পারেন।
নিকিতা জি।

5

এটি করার আরও ভাল উপায় হ'ল:

background_activity.xml

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:gravity="fill">
        <color android:color="@color/black"/>
    </item>
    <item>
        <shape android:gravity="fill">
            <solid android:color="@color/white"/>
            <corners android:radius="10dip"/>
            <padding android:left="0dip" android:top="0dip" android:right="0dip" android:bottom="0dip" />
        </shape>
    </item>
</layer-list>

এটি এপিআই 21 এর নীচেও কাজ করবে এবং আপনাকে এরকম কিছু দেবে:

ফলাফল


আপনি যদি আরও কিছু প্রচেষ্টা আরও ভাল নিয়ন্ত্রণ করতে ইচ্ছুক হন তবে android.support.v7.widget.CardViewতার cardCornerRadiusবৈশিষ্ট্যটি ব্যবহার করুন (এবং কার্ডভিউয়ের সাথে কোনও ড্রপ ছায়া থেকে মুক্তি পেতে elevationঅ্যাট্রিবিউট সেট করুন 0dp)। এছাড়াও, এটি এপিআই স্তর থেকে কম 15 হিসাবে কাজ করবে।


যদি বিষয়বস্তুটি পটভূমিতে ফিট করে তবে এটি এটিকে ওভাররাইড করবে। আপনি যে আকারটি সেট করেছেন তা এটি সত্যই ক্লিপ করে না।
অ্যান্ড্রয়েড বিকাশকারী

আপনি অন্য মতামত বোঝাতে চান? আপনি কী বলতে চাইছেন দয়া করে কোডটি আপডেট করতে পারেন? ধারণাটি হল গোলাকার কোণগুলি কালো অঞ্চল রাখবে না। কোণগুলির চারপাশে, স্বচ্ছ রঙ হওয়া উচিত।
অ্যান্ড্রয়েড বিকাশকারী

ওহ আমি এখন আপনার প্রশ্ন পেয়েছি। আমার ধারনা, আপনি আপনার সামগ্রীতে একটি ছোট স্থির মার্জিন দিয়ে কাজ করতে পারেন
আব্দুল ওয়াসেই

তবে তারপরে, সামগ্রীটি আপনার পছন্দ মতো আকারে কাটা যাবে না, কারণ স্থির মার্জিনগুলি আয়তক্ষেত্রাকার হয়, এবং আপনি পছন্দ করেন এমন আকৃতি অনুসারে নয়।
অ্যান্ড্রয়েড বিকাশকারী

5

প্রোগ্রাম কোণে সেট কোণার ব্যাসার্ধের জন্য ফাংশন

static void setCornerRadius(GradientDrawable drawable, float topLeft,
        float topRight, float bottomRight, float bottomLeft) {
    drawable.setCornerRadii(new float[] { topLeft, topLeft, topRight, topRight,
            bottomRight, bottomRight, bottomLeft, bottomLeft });
}

static void setCornerRadius(GradientDrawable drawable, float radius) {
    drawable.setCornerRadius(radius);
}

ব্যবহার

GradientDrawable gradientDrawable = new GradientDrawable();
gradientDrawable.setColor(Color.GREEN);
setCornerRadius(gradientDrawable, 20f);
//or setCornerRadius(gradientDrawable, 20f, 40f, 60f, 80f); 

view.setBackground(gradientDrawable);

4
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"/>
    <stroke android:width="3dip" android:color="#B1BCBE" />
    <corners android:radius="10dip"/>
    <padding android:left="3dip" android:top="3dip" android:right="3dip" android:bottom="3dip" />
</shape>

@ ডেভিড, মাত্র স্ট্রোকের মতো প্যাডিং রাখুন, যাতে চিত্র নির্বিশেষে সীমানা দৃশ্যমান হতে পারে


3

প্যারামিটারগুলি কী প্রভাব ফেলবে তা সম্পর্কে আপনাকে যুক্তিসঙ্গত ধারণা জানাতে আমি আমার মন্তব্যগুলির সাথে @ গৌরবসাপিয়েন্সের উত্তর নিয়েছি।

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Background color -->
    <solid android:color="@color/white" />

    <!-- Stroke around the background, width and color -->
    <stroke android:width="4dp" android:color="@color/drop_shadow"/>

    <!-- The corners of the shape -->
    <corners android:radius="4dp"/>

    <!-- Padding for the background, e.g the Text inside a TextView will be 
    located differently -->
    <padding android:left="10dp" android:right="10dp" 
             android:bottom="10dp" android:top="10dp" />

</shape>

যদি আপনি কেবল এমন কোনও আকৃতি তৈরি করতে সন্ধান করছেন যা কোণে গোল করে, প্যাডিং সরিয়ে স্ট্রোক করবে। আপনি যদি শক্তটিকে সরিয়ে ফেলেন তবে আপনি কার্যকরভাবে স্বচ্ছ পটভূমিতে বৃত্তাকার কোণ তৈরি করতে পারবেন।

অলস হওয়ার জন্য আমি নীচে একটি আকৃতি তৈরি করেছি, যা গোলাকার কোণগুলির সাথে কেবল একটি শক্ত সাদা পটভূমি - উপভোগ করুন! :)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Background color -->
    <solid android:color="@color/white" />

    <!-- The corners of the shape -->
    <corners android:radius="4dp"/>

</shape>

3

আপনার এক্সএমএল অঙ্কনযোগ্য তৈরি করুন, layout_background.xml

 <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
      <solid android:color="@color/your_colour" />
      <stroke
            android:width="2dp"
            android:color="@color/your_colour" />
      <corners android:radius="10dp" />      
    </shape>
 <--width, color, radius should be as per your requirement-->

এবং তারপরে, এটি আপনারটিতে যুক্ত করুন layout.xml

 android:background="@drawable/layout_background"

2

উপাদান উপাদান লাইব্রেরির সাহায্যে আপনি কাস্টম আকারগুলি আঁকারMaterialShapeDrawable জন্য ব্যবহার করতে পারেন ।

আপনার এক্সএমএল লেআউটে কেবল লিনিয়ারলআউটটি রাখুন:

<LinearLayout
    android:id="@+id/linear_rounded"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ..>

    <!-- content ..... -->

</LinearLayout>

তারপরে আপনার কোডটিতে আপনি একটি প্রয়োগ করতে পারেন ShapeAppearanceModel। কিছুটা এইরকম:

float radius = getResources().getDimension(R.dimen.default_corner_radius);

LinearLayout linearLayout= findViewById(R.id.linear_rounded);
ShapeAppearanceModel shapeAppearanceModel = new ShapeAppearanceModel()
    .toBuilder()
    .setAllCorners(CornerFamily.ROUNDED,radius)
    .build();

MaterialShapeDrawable shapeDrawable = new MaterialShapeDrawable(shapeAppearanceModel);
//Fill the LinearLayout with your color
shapeDrawable.setFillColor(ContextCompat.getColorStateList(this,R.color.secondaryLightColor));


ViewCompat.setBackground(linearLayout,shapeDrawable);

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

দ্রষ্টব্য :: এর জন্য উপাদান উপাদান লাইব্রেরির 1.1.0 সংস্করণ প্রয়োজন requires


1
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:padding="@dimen/_10sdp"
android:shape="rectangle">

<solid android:color="@color/header" />

<corners
    android:bottomLeftRadius="@dimen/_5sdp"
    android:bottomRightRadius="@dimen/_5sdp"
    android:topLeftRadius="@dimen/_5sdp"
    android:topRightRadius="@dimen/_5sdp" />

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