গোলাকার কোণগুলি দিয়ে কীভাবে একটি দৃশ্য তৈরি করবেন?


94

আমি বৃত্তাকার প্রান্তগুলি সহ অ্যান্ড্রয়েডে একটি দৃশ্য তৈরি করার চেষ্টা করছি। আমি এখন পর্যন্ত যে সমাধানটি পেয়েছি তা হ'ল গোলাকার কোণগুলির সাথে একটি আকার নির্ধারণ করা এবং সেই দৃশ্যের পটভূমি হিসাবে এটি ব্যবহার করা।

এখানে আমি যা করেছি তা এখানে নীচের মতো একটি অঙ্কনযোগ্য সংজ্ঞা দিন:

<padding
android:top="2dp"
android:bottom="2dp"/>
<corners android:bottomRightRadius="20dp"
android:bottomLeftRadius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp"/>

এখন আমি এটিকে নীচের মত আমার লেআউটের পটভূমি হিসাবে ব্যবহার করেছি:

<LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="10dp"
        android:clipChildren="true"
        android:background="@drawable/rounded_corner">

এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে, আমি দেখতে পাচ্ছি যে প্রান্তটি বৃত্তাকার প্রান্তে রয়েছে।

তবে আমার বিন্যাসটি এতে অন্যান্য অনেক শিশু মতামত পেয়েছে, বলুন কোনও চিত্র ভিউ বা এ MapView। আমি যখন ImageViewউপরের লেআউটটির ভিতরে একটি স্থির রাখি , তখন চিত্রের কোণগুলি ক্রপ / ক্রপ করা হয় না, পরিবর্তে এটি পূর্ণ প্রদর্শিত হয়।

এটিকে এখানে বর্ণিত মত কাজ করার জন্য আমি অন্যান্য কাজের ক্ষেত্রগুলি দেখেছি ।

তবে কোনও দেখার জন্য বৃত্তাকার কোণগুলি সেট করার কোনও পদ্ধতি আছে এবং তার সমস্ত সন্তানের মতামতগুলি মূল কোণে গোলাকার কোণগুলির মধ্যে রয়েছে?


আপনি যদি লিনিয়ারলআউট পর্যন্ত প্রসারিত একটি কাস্টম বিন্যাস ব্যবহার করেন এবং এর বস্তুটি তৈরি হওয়ার সময়, সেই লেআউটের সমস্ত শিশুকে পুনরাবৃত্তি করুন এবং তাদেরকে বৃত্তাকার সীমানা ব্যাকগ্রাউন্ড প্রয়োগ করুন?
MysticMagicag

4
android.support.v7.widget.CardView এর সমাধান বলে মনে হচ্ছে
রকেটস্পেসার

এই সমাধানটি আমার জন্য এটি সমাধান করেছে, তবে সাবক্লাসিংয়ের প্রয়োজন: /programming/5574212/android-view-clipping
অ্যারন


গুগল নতুন রূপরেখা আছে, নতুন প্রযুক্তি ভাল [জেটপ্যাক কম্পোজ] [1] [1] হল stackoverflow.com/questions/6054562/...
Ucdemir

উত্তর:


128

আর একটি পদ্ধতি নীচের মত একটি কাস্টম লেআউট ক্লাস করা হয়। এই বিন্যাসটি প্রথমে এর সামগ্রীগুলি একটি অফস্ক্রিন বিটম্যাপে আঁকবে, একটি বৃত্তাকার রেক্টরের সাথে অফস্ক্রিন বিটম্যাপটি মাস্ক করে এবং তারপরে প্রকৃত ক্যানভাসে অফস্ক্রিন বিটম্যাপ আঁকবে।

আমি এটি চেষ্টা করেছি এবং এটি কাজ করে বলে মনে হচ্ছে (কমপক্ষে আমার সহজ টেস্টকেসের জন্য)। এটি অবশ্যই নিয়মিত লেআউটের তুলনায় কর্মক্ষমতাকে প্রভাবিত করবে।

package com.example;

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.widget.FrameLayout;

public class RoundedCornerLayout extends FrameLayout {
    private final static float CORNER_RADIUS = 40.0f;

    private Bitmap maskBitmap;
    private Paint paint, maskPaint;
    private float cornerRadius;

    public RoundedCornerLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics);

        paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
        maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

        setWillNotDraw(false);
    }

    @Override
    public void draw(Canvas canvas) {
        Bitmap offscreenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas offscreenCanvas = new Canvas(offscreenBitmap);

        super.draw(offscreenCanvas);

        if (maskBitmap == null) {
            maskBitmap = createMask(canvas.getWidth(), canvas.getHeight());
        }

        offscreenCanvas.drawBitmap(maskBitmap, 0f, 0f, maskPaint);
        canvas.drawBitmap(offscreenBitmap, 0f, 0f, paint);
    }

    private Bitmap createMask(int width, int height) {
        Bitmap mask = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
        Canvas canvas = new Canvas(mask);

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);

        canvas.drawRect(0, 0, width, height, paint);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        canvas.drawRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, paint);

        return mask;
    }
}

এটি একটি সাধারণ বিন্যাসের মতো ব্যবহার করুন:

<com.example.RoundedCornerLayout
    android:layout_width="200dp"
    android:layout_height="200dp">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/test"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#ff0000"
        />

</com.example.RoundedCornerLayout>

4
আমি ভিতরে ভিতরে জুম ফাংশন সহ এই চিত্রটি দেখার জন্য এই লেআউটটি ব্যবহার করছি তবে আমি যখন জুম করার চেষ্টা করব তখন এই লেআউটটি টাচ শ্রোতা সনাক্ত করতে পারে না, কীভাবে এই বিন্যাসে টাচ শ্রোতার ফাংশন যুক্ত করব?
মুহাম্মদ নাফিয়ান ওয়াইল্ডানা

4
আমি এই পদ্ধতিটি ব্যবহার করেছি এবং সূক্ষ্মভাবে কাজ করি। তবে আমি যখন বিন্যাসের ভিতরে একটি সম্পাদনা পাঠ্য রেখেছি, আমি টাইপ করলে স্ক্রিনটি আপডেট হয় না I যখন আমি উইন্ডোটি বন্ধ করি, তখন পাঠ্যটি প্রদর্শিত হয়। আমি একবার কীবোর্ডটি বন্ধ করে দিয়ে পর্দা আপডেট হচ্ছে। এটির কোনও সমাধান?
সজিব আচার্য

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

4
এটি গ্লাইড লাইব্রেরি থেকে লোড হওয়া চিত্রগুলির সাথে কাজ করে না যা প্লেসোল্ডার ট্রান্সজিশন ব্যবহার করে (বা অন্য কোনও অ্যানিমেটেড শিশুরা আসলে) actually আমার একটি বিকল্প সমাধান আছে তবে এটির জন্য আপনার ব্যাকগ্রাউন্ডের রঙটি শক্ত রঙ হতে হবে। Gist.github.com/grennis/da9f86870c45f3b8ae00912edb72e868
গ্রেগ এনিস

4
দুর্দান্ত এবং দরকারী সমাধান কিন্তু খুব ব্যয়বহুল। মাত্র ছয়টি উপাদানের সাথে রিসাইক্লার ভিউ যার মধ্যে একটি ছবি রয়েছে তা সহজেই স্ক্রোল করতে পারে না। এবং এটি ডিভাইস পাওয়ারের উপর নির্ভর করে না (স্যামসাং এস 9 বা উইলেফক্স সুইফট 2)। stackoverflow.com/a/41098690/4399323 ভাল উত্তর!
ভ্যালেন্টিন ইউরিয়েভ

73

অথবা আপনি এর android.support.v7.widget.CardViewমতো একটি ব্যবহার করতে পারেন :

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    card_view:cardBackgroundColor="@color/white"
    card_view:cardCornerRadius="4dp">

    <!--YOUR CONTENT-->
</android.support.v7.widget.CardView>

আমি অনেক উপায়ে চেষ্টা করেছি, আপনারাই আমার সমস্যার সেরা সমাধান। ধন্যবাদ!
উইজচেন

উচ্চতা সরাতে সক্ষম নয়। ডিজাইনের উন্নয়নের প্রয়োজন হলে সূক্ষ্ম কাজ করে।
আবদালরহমান শতো

4
@ আবদালরহমানশাতো বিকাশকারী.অ্যান্ড্রয়েড / রেফারেন্স / অ্যান্ড্রয়েড / সাপোর্ট / ভি / / উইজেট/ … এর জন্য বৈশিষ্ট্য রয়েছে। আপনি কি তাদের "0" এ সেট করার চেষ্টা করেছেন?
রকেটস্পেসার

4
একটি অসুবিধা হ'ল এটি <21 অ্যান্ড্রয়েড এপি'র সমর্থন করে না
Itai Spector

52

form.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

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

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

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

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

</shape>

এবং আপনার বিন্যাসের ভিতরে

<LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="10dp"
        android:clipChildren="true"
        android:background="@drawable/shape">

        <ImageView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:src="@drawable/your image"
             android:background="@drawable/shape">

</LinearLayout>

4
@ জাচ: কোনভাবে এটি কাজ করতে ব্যর্থ হয়েছিল? আপনি যখন আসল প্রশ্ন জিজ্ঞাসা করলেন তখন আপনার অ্যাপটি কীভাবে কাজ করছে?
লার্শ

4
ক্লিপচিল্ডেন অকেজো এবং চিত্রের দৃশ্যটি এখনও দেখার বাইরে প্রসারিত।
আবদালরহমান শাতৌ

4
আমি আশা করি যে এর জন্য আমি আপনাকে একটি অনুদান দিতে পারতাম। আপনাকে ধন্যবাদ
ওডিস

4
আমি মনে করি না যে চিত্রটি একটি আয়তক্ষেত্রযুক্ত হলে এই পদ্ধতির কাজ হবে কারণ চিত্রের সামগ্রীর পিছনে পটভূমি আঁকা হবে। এটি কেবল এমন চিত্রগুলির সাথেই কাজ করতে পারে যার স্বচ্ছতা রয়েছে এবং তাদের নিজেরাই কোণাকার রয়েছে।
হর্ষ বর্ধন

23

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

আমার জন্য সর্বোত্তম পদ্ধতি এবং সহজতমটি ভিউতে একটি মুখোশ লাগানোর সাথে জড়িত:

@Override
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
    super.onSizeChanged(width, height, oldWidth, oldHeight);

    float cornerRadius = <whatever_you_want>;
    this.path = new Path();
    this.path.addRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, Path.Direction.CW);
}

@Override
protected void dispatchDraw(Canvas canvas) {
    if (this.path != null) {
        canvas.clipPath(this.path);
    }
    super.dispatchDraw(canvas);
}

এটি কিভাবে ব্যবহার করবেন?
মাকসিম নিয়াজেভ

@ ম্যাক্সিমকনিয়াজেভ আপনি যে লেআউটটি চান তার একটি সাবক্লাস তৈরি করুন (উদাহরণস্বরূপ: ফ্রেমলআউট), তারপরে এই দুটি পদ্ধতিটি এই সাবক্লাসে পেস্ট করুন এবং আপনার পছন্দসই কোণার ব্যাসার্ধের মান (উদাহরণস্বরূপ উত্স থেকে) এর সাথে '<WwW__ou_ant>' প্রতিস্থাপন করুন। এটাই. এটি কি আপনার পক্ষে যথেষ্ট স্পষ্ট বা আপনার উদাহরণের দরকার আছে?
গাধা

আপনাকে অনেক ধন্যবাদ, এটি রিসাইক্লার ভিউয়ের জন্য সত্যই আরও ভাল কাজ করে!
ভ্যালেন্টিন ইউরিয়েভ

18

লেআউটে টাচ শ্রোতাদের যুক্ত করার সময় আপনার যদি সমস্যা হয়। এই লেআউটটিকে প্যারেন্ট লেআউট হিসাবে ব্যবহার করুন।

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.widget.FrameLayout;

public class RoundedCornerLayout extends FrameLayout {
    private final static float CORNER_RADIUS = 6.0f;
    private float cornerRadius;

    public RoundedCornerLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics);
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }


    @Override
    protected void dispatchDraw(Canvas canvas) {
        int count = canvas.save();

        final Path path = new Path();
        path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), cornerRadius, cornerRadius, Path.Direction.CW);
        canvas.clipPath(path, Region.Op.REPLACE);

        canvas.clipPath(path);
        super.dispatchDraw(canvas);
        canvas.restoreToCount(count);
    }


}

যেমন

<?xml version="1.0" encoding="utf-8"?>
<com.example.view.RoundedCornerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/patentItem"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingRight="20dp">
        ... your child goes here
    </RelativeLayout>
</com.example.view.RoundedCornerLayout>

4
স্ক্রিনে অনেক অ্যানিমেশন না থাকলে এটি ভালভাবে কাজ করে, যা বারবার স্ক্রিনটি বার বার অঙ্কন করে; যেহেতু, এটি সমালোচনামূলকভাবে পারফরম্যান্সকে ধীর করবে। কার্ডভিউয়ের চেষ্টা করা উচিত, যার একটি দক্ষ গোলাকার কোণার পদ্ধতি রয়েছে (ক্লিপিং পাথ বা ক্যানভাস।ড্রআরউন্ডরেক্ট ব্যবহার করবেন না - এপিআই 17 এর নীচে খারাপ, তবে পোর্টারফিল্টারডফলার ব্যবহার করুন)
ট্যান ডেট

18

একটি XML নামক ফাইল তৈরি round.xmlমধ্যে drawableফোল্ডার এবং এই বিষয়বস্তুতে আটকান:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
  <solid android:color="#FFFFFF" />
  <stroke android:width=".05dp" android:color="#d2d2d2" />
  <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" android:bottomRightRadius="5dp" android:bottomLeftRadius="5dp"/>
</shape>

তারপরে যেকোন আইটেম round.xmlহিসাবে ব্যবহার backgroundকরুন। তারপরে এটি আপনাকে গোলাকার কোণগুলি দেবে।


9

অ্যান্ড্রয়েড এল-এ আপনি এফেক্টটি পেতে কেবল View.setClipToOutline ব্যবহার করতে সক্ষম হবেন । পূর্ববর্তী সংস্করণগুলিতে একটি নির্দিষ্ট আকারে কেবল এলোমেলো ভিউগ্রুপের সামগ্রীগুলি ক্লিপ করার কোনও উপায় নেই।

আপনাকে এমন কিছু চিন্তা করতে হবে যা আপনাকে অনুরূপ প্রভাব দেয়:

  • আপনার যদি কেবল চিত্র ভিউতে বৃত্তাকার কোণগুলির প্রয়োজন হয় তবে আপনি ব্যাকগ্রাউন্ড হিসাবে ব্যবহার করছেন এমন আকারের উপর চিত্রটি 'রঙ করতে' একটি শেডার ব্যবহার করতে পারেন। একটি উদাহরণের জন্য এই লাইব্রেরি একবার দেখুন ।

  • আপনার যদি সত্যই প্রতিটি বাচ্চাকে ক্লিপড করা দরকার তবে আপনি নিজের বিন্যাসের উপর অন্য কোনও দৃশ্য দেখতে পারেন? আপনি যে কোনও রঙ ব্যবহার করছেন তার পটভূমি এবং মাঝখানে একটি বৃত্তাকার 'গর্ত' রয়েছে? আপনি আসলে একটি কাস্টম ভিউগ্রুপ তৈরি করতে পারেন যা অনড্র পদ্ধতিতে ওভাররাইডকারী প্রতিটি বাচ্চার উপরে এই আকারটি আঁকতে পারে।


4

নিম্নলিখিত কোড সহ আপনার অঙ্কনযোগ্য ফোল্ডারে একটি এক্সএমএল ফাইল তৈরি করুন। (আমি যে ফাইলটি তৈরি করেছি তার নাম গোলকৃত_কর্ণার.এক্সএমএল)

rounded_corner.xml

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

        <!-- view background color -->
        <solid
            android:color="#a9c5ac" >
        </solid>

        <!-- view border color and width -->
        <stroke
            android:width="3dp"
            android:color="#1c1b20" >
        </stroke>

        <!-- If you want to add some padding -->
        <padding
            android:left="4dp"
            android:top="4dp"
            android:right="4dp"
            android:bottom="4dp"    >
        </padding>

        <!-- Here is the corner radius -->
        <corners
            android:radius="10dp"   >
        </corners>
    </shape>

আর এই রাখা drawableযেমন backgroundদৃশ্য যা আপনি বৃত্তাকার কোণ সীমান্ত রাখতে চান জন্য। এটি একটি জন্য রাখা যাকLinearLayout

    <LinearLayout android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/rounded_corner"
            android:layout_centerInParent="true">

            <TextView android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Hi, This layout has rounded corner borders ..."
                android:gravity="center"
                android:padding="5dp"/>

    </LinearLayout>

3

এই টিউটোরিয়ালটি এবং এর নীচে সমস্ত আলোচনার অনুসরণ করুন - http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/

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

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

এটাই আমি শেষ পর্যন্ত করেছি।


3

আপনি এর androidx.cardview.widget.CardViewমতো একটি ব্যবহার করতে পারেন :

<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"       
        app:cardCornerRadius="@dimen/dimen_4"
        app:cardElevation="@dimen/dimen_4"
        app:contentPadding="@dimen/dimen_10">

       ...

</androidx.cardview.widget.CardView>

বা

form.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

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

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

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

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

</shape>

এবং আপনার বিন্যাসের ভিতরে

<LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape">

        ...

</LinearLayout>

3

CardViewঅ্যান্ড্রয়েড স্টুডিও 3.0.1 উপরে API 27 আমার জন্য কাজ করেন। colorPrimaryউল্লেখ করা হয়েছিল res/values/colors.xmlফাইল এবং মাত্র একটি উদাহরণ। এর লেআউট_ 0dpপ্রস্থের জন্য পিতামাতার প্রস্থে প্রসারিত হবে। আপনার প্রয়োজনের সীমাবদ্ধতা এবং প্রস্থ / উচ্চতা আপনাকে কনফিগার করতে হবে।

<android.support.v7.widget.CardView
    android:id="@+id/cardView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardCornerRadius="4dp"
    app:cardBackgroundColor="@color/colorPrimary">

    <!-- put your content here -->

</android.support.v7.widget.CardView>

3

উপাদান উপাদান লাইব্রেরির Viewসাথে গোলাকার কোণগুলি দিয়ে তৈরি করার সর্বোত্তম উপায় হ'ল ব্যবহার করা MaterialShapeDrawable

কাস্টম বৃত্তাকার কোণগুলির সাথে একটি আকারের চেহারা মডেল তৈরি করুন:

ShapeAppearanceModel shapeAppearanceModelLL1 = new ShapeAppearanceModel()
        .toBuilder()
        .setAllCorners(CornerFamily.ROUNDED,radius16)
        .build();

একটি তৈরি করুন MaterialShapeDrawable:

MaterialShapeDrawable shapeDrawableLL1 = new MaterialShapeDrawable(shapeAppearanceModeLL1);

যদি আপনি অন্ধকার থিমের জন্য একটি উচ্চতা ওভারলেও প্রয়োগ করতে চান তবে এটি ব্যবহার করুন:

MaterialShapeDrawable shapeDrawableLL1 = MaterialShapeDrawable.createWithElevationOverlay(this, 4.0f);
shapeDrawableLL1.setShapeAppearanceModel(shapeAppearanceModelLL1);

Alচ্ছিক: আকারে প্রয়োগ করুন ব্যাকগ্রাউন্ডের রঙ এবং স্ট্রোকযোগ্য

shapeDrawableLL1.setFillColor(
       ContextCompat.getColorStateList(this,R.color...));
 shapeDrawableLL1.setStrokeWidth(2.0f);
 shapeDrawableLL1.setStrokeColor(
       ContextCompat.getColorStateList(this,R.color...));

অবশেষে আপনার LinearLayout(বা অন্যান্য দৃষ্টিতে) ব্যাকগ্রাউন্ড হিসাবে অঙ্কনযোগ্য শেপটি প্রয়োগ করুন :

LinearLayout linearLayout1= findViewById(R.id.ll_1);
ViewCompat.setBackground(linearLayout1,shapeDrawableLL1);

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


2

জাপ ভ্যান হেনস্টস্টমের উত্তর থেকে পার্থক্য:

  1. মাস্ক বিটম্যাপের পরিবর্তে বিটম্যাপ শেডার ব্যবহার করুন ।
  2. শুধুমাত্র একবার বিটম্যাপ তৈরি করুন।
public class RoundedFrameLayout extends FrameLayout {
    private Bitmap mOffscreenBitmap;
    private Canvas mOffscreenCanvas;
    private BitmapShader mBitmapShader;
    private Paint mPaint;
    private RectF mRectF;

    public RoundedFrameLayout(Context context) {
        super(context);
        init();
    }

    public RoundedFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public RoundedFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setWillNotDraw(false);
    }

    @Override
    public void draw(Canvas canvas) {
        if (mOffscreenBitmap == null) {
            mOffscreenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
            mOffscreenCanvas = new Canvas(mOffscreenBitmap);
            mBitmapShader = new BitmapShader(mOffscreenBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(mBitmapShader);
            mRectF = new RectF(0f, 0f, canvas.getWidth(), canvas.getHeight());
        }
        super.draw(mOffscreenCanvas);

        canvas.drawRoundRect(mRectF, 8, 8, mPaint);
    }
}

2
public class RoundedCornerLayout extends FrameLayout {
    private double mCornerRadius;

    public RoundedCornerLayout(Context context) {
        this(context, null, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

    public double getCornerRadius() {
        return mCornerRadius;
    }

    public void setCornerRadius(double cornerRadius) {
        mCornerRadius = cornerRadius;
    }

    @Override
    public void draw(Canvas canvas) {
        int count = canvas.save();

        final Path path = new Path();
        path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), (float) mCornerRadius, (float) mCornerRadius, Path.Direction.CW);
        canvas.clipPath(path, Region.Op.REPLACE);

        canvas.clipPath(path);
        super.draw(canvas);
        canvas.restoreToCount(count);
    }
}

1

আপনার প্রদত্ত টিউটোরিয়াল লিঙ্কটি মনে হচ্ছে যে আপনার বাচ্চার উপাদানগুলির লেআউট_উইথ এবং লেআউট_ উচ্চ বৈশিষ্ট্যগুলি ম্যাচ-প্যারেন্টের জন্য সেট করতে হবে।

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

1

Com.google.android.matory: উপাদান: 1.2.0-beta01 ব্যবহার করে গোল কোণার চিত্র তৈরি করতে

 float radius = context.getResources().getDimension(R.dimen.border_radius_hug);
    shapeAppearanceModel = new ShapeAppearanceModel()
            .toBuilder()
            .setAllCorners(CornerFamily.ROUNDED,radius)
            .build();

imageView.setShapeAppearanceModel(shapeAppearanceModel)

বা আপনি যদি এটি এক্সএমএল ফাইলে ব্যবহার করতে চান:

  <com.google.android.material.imageview.ShapeableImageView
            android:id="@+id/thumb"
            android:layout_width="80dp"
            android:layout_height="60dp"
            app:shapeAppearanceOverlay="@style/circleImageView"
            />

স্টাইল.এক্সএমএল এ যুক্ত করুন:

<style name="circleImageView" parent="">
      <item name="cornerFamily">rounded</item>
      <item name="cornerSize">10%</item>
</style>

0

আপনার লিনিয়ার বিন্যাসের সাহায্যে এই সম্পত্তিটি চেষ্টা করুন এটি
সরঞ্জামগুলিতে সহায়তা করবে : প্রসঙ্গ = "। youractivity"


0
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {

        Bitmap roundedBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap
                .getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(roundedBitmap);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        final float roundPx = pixels;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return roundedBitmap;
    }

0

আপনি কিছু নির্দিষ্ট কোণে গোল করতে চান।

fun setCorners() {
        
        val mOutlineProvider = object : ViewOutlineProvider() {
            override fun getOutline(view: View, outline: Outline) {

                val left = 0
                val top = 0;
                val right = view.width
                val bottom = view.height
                val cornerRadiusDP = 16f
                val cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, cornerRadiusDP, resources.displayMetrics).toInt()

                // all corners
                outline.setRoundRect(left, top, right, bottom, cornerRadius.toFloat())

                /* top corners
                outline.setRoundRect(left, top, right, bottom+cornerRadius, cornerRadius.toFloat())*/

                /* bottom corners
                outline.setRoundRect(left, top - cornerRadius, right, bottom, cornerRadius.toFloat())*/

                /* left corners
                outline.setRoundRect(left, top, right + cornerRadius, bottom, cornerRadius.toFloat())*/

                /* right corners
                outline.setRoundRect(left - cornerRadius, top, right, bottom, cornerRadius.toFloat())*/

                /* top left corner
                outline.setRoundRect(left , top, right+ cornerRadius, bottom + cornerRadius, cornerRadius.toFloat())*/

                /* top right corner
                outline.setRoundRect(left - cornerRadius , top, right, bottom + cornerRadius, cornerRadius.toFloat())*/

                /* bottom left corner
                outline.setRoundRect(left, top - cornerRadius, right + cornerRadius, bottom, cornerRadius.toFloat())*/

                /* bottom right corner
                outline.setRoundRect(left - cornerRadius, top - cornerRadius, right, bottom, cornerRadius.toFloat())*/

            }
        }

        myView.apply {
            outlineProvider = mOutlineProvider
            clipToOutline = true
        }
    }

-1

আয়তক্ষেত্রের সাহায্যে xML এ আকারটি ব্যবহার করুন as


আমি ইতিমধ্যে দ্যাঠাত করেছি, তবে আরও ভাল পদ্ধতি আছে কিনা তা জানতে চাই?
Zach

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