অ্যান্ড্রয়েডে গোলাকার কোণগুলির সাহায্যে আমি কীভাবে একটি তালিকাভিউ তৈরি করব?


176

অ্যান্ড্রয়েডে গোলাকার কোণগুলির সাহায্যে আমি কীভাবে একটি তালিকাভিউ তৈরি করব?


এই প্রশ্নটি সত্যিই দরকারী, তাই আপনার উত্তর .. !!
সাজাদ করুথেদাথ

উত্তর:


371

এটি করার একটি উপায় এখানে রয়েছে (যদিও অ্যান্ড্রয়েড ডকুমেন্টেশনের জন্য ধন্যবাদ!):

নিম্নলিখিতটি কোনও ফাইলে যুক্ত করুন (কাস্টম শেপ.এক্সএমএল বলুন) এবং তারপরে এটি স্থাপন করুন (res / অঙ্কনযোগ্য / কাস্টম শেপ.এক্সএমএল)

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle"> 
     <gradient 
         android:startColor="#SomeGradientBeginColor"
         android:endColor="#SomeGradientEndColor" 
         android:angle="270"/> 

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

একবার আপনি এই ফাইলটি তৈরির কাজ শেষ করার পরে কেবল নীচের একটি উপায়ে ব্যাকগ্রাউন্ড সেট করুন:

কোডের মাধ্যমে: listView.setBackgroundResource(R.drawable.customshape);

এক্সএমএলের মাধ্যমে , কেবল ধারকটিতে নিম্নলিখিত বৈশিষ্ট্য যুক্ত করুন (উদা: লিনিয়ারলআউট বা যে কোনও ক্ষেত্রে):

android:background="@drawable/customshape"

আশা করি কেউ এটি দরকারী হিসাবে ...


2
দুর্দান্ত টিপ জন্য ধন্যবাদ। শুধু এফওয়াইআই, অনুলিপি-পেস্টিং আমাকে রানটাইম ব্যতিক্রম বলেছে, "এক্সএমএলপুলপার্সার এক্সেকশন: বাইনারি এক্সএমএল ফাইল লাইন # 4 <গ্রেডিয়েন্ট> ট্যাগের জন্য 'কোণ' বৈশিষ্ট্যটি 45 এর একাধিক হতে হবে" .. কোণটি 270 এ পরিবর্তন করে সহজেই প্রতিকার করা হয়েছে
এ্যালক্লাও

সংশোধনের জন্য ধন্যবাদ ... তবে কেন এমনটি হতে পারে জানি না .. আপনি কোনও নির্দিষ্ট কারণ খুঁজে পেয়েছেন?
কিংবদন্তি

@teedyay: যে কোনও সময় পাল :)
কিংবদন্তি

1
অ্যালক্ল্যাজের মতোই, কোণটি 45 এর একাধিক হওয়া উচিত: "এক্সএমএলপুলপার্সার এক্সেকশন: বাইনারি এক্সএমএল ফাইল লাইন # 4 <গ্রেডিয়েন্ট> ট্যাগটির 45 টির একাধিক হতে 'কোণ' বৈশিষ্ট্য প্রয়োজন"
ইউসুফ

29
যদিও এটি নির্বাচন-হাইলাইটিংয়ের সাথে ভালভাবে কাজ করে না: উপরে বা নীচের আইটেমটি নির্বাচন করা হলে এটি বর্ণের ব্যাকগ্রাউন্ডটি আয়তক্ষেত্রাকার এবং বৃত্তাকার কোণার পটভূমির শীর্ষে আঁকা হয়।
ক্রিস ভ্যান বেল

56

যদিও এটি কাজ করে, এটি পুরো পটভূমির রঙটিও বের করেছে। আমি কেবল সীমান্ত করার জন্য একটি উপায় খুঁজছিলাম এবং কেবলমাত্র এটির সাথে এই এক্সএমএল লেআউট কোডটি প্রতিস্থাপন করেছি এবং আমি যেতে ভালই লাগলাম!

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="4dp" android:color="#FF00FF00" />
    <padding android:left="7dp" android:top="7dp"
            android:right="7dp" android:bottom="7dp" />
    <corners android:radius="4dp" />
</shape> 

এছাড়াও চেক আউট এই উত্তর
ThomasRS

12

@ ক্রিস-ভ্যান-বেল

শীর্ষ এবং নীচের সারির জন্য নির্বাচনের হাইলাইট নিয়ে সমস্যা রয়েছে তাদের জন্য যেখানে ব্যাকগ্রাউন্ড আয়তক্ষেত্রটি নির্বাচনের উপরে প্রদর্শিত হবে আপনার তালিকা তালিকাটি স্বচ্ছ বর্ণের জন্য আপনাকে নির্বাচক সেট করতে হবে।

listView.setSelector(R.color.transparent);

Color.xML এ কেবল নিম্নলিখিতটি যুক্ত করুন -

<color name="transparent">#00000000</color>

5
এটা আমার জন্য কাজ করে না। আমি তবে নিম্নলিখিত লাইনটি যুক্ত করেছি এবং এটি থেকে মুক্তি পেয়েছে:android:cacheColorHint="@android:color/transparent"
সিজার

1
এটি অবশ্যই আমার জন্য নির্বাচনের বিষয়টি সমাধান করেছে - ধন্যবাদ! আপনি নিজের তৈরি করার পরিবর্তে নির্বাচক রঙের জন্য android.R.color.transpant ব্যবহার করতে পারেন।
গ্রেগ 7gkb

3
এটি প্রোগ্র্যাম্যাটিকভাবে করার পরিবর্তে নির্বাচনের রঙটি লুকানোর জন্য এক্সএমএল লেআউটে এটি আপনার তালিকাভিউতে যুক্ত করুন: অ্যান্ড্রয়েড: listSelector = "# 00000000"
এলাদ নাভা

@ অ্যালভিনস তালিকার মত আইটেমটি হাইলাইট করার জন্য লেআউটকে নির্বাচনযোগ্য করার কোনও উপায় আছে কি?
ভারত দোদেজা

আমি যদি তালিকার জন্য নির্বাচকের জন্য অস্বচ্ছ রঙ ব্যবহার করতে চাই তবে আমার কী করা উচিত?
সুতিয়ানশি

3

অন্যান্য উত্তরগুলি খুব দরকারী, লেখকদের ধন্যবাদ!

তবে আমি দেখতে পাচ্ছিলাম না যে আয়তক্ষেত্রটি কাস্টমাইজ করার সময় কোনও আইটেমটি নির্বাচনের সময় হাইলাইট করা @ আলভিনস @ ভারত দোজেহাকে অক্ষম করার চেয়ে।

নিম্নলিখিত আকারটি একই আকারের জন্য নির্বাচিত হওয়ার পরে কোনও আউটলাইন এবং একটি হালকা ধূসর ছাড়া গোলাকার তালিকার ভিউ আইটেম ধারক তৈরি করতে আমার পক্ষে কাজ করে:

আপনার এক্সএমএলে একটি নির্বাচক থাকতে হবে যেমন যেমন (রেজো / ড্রইয়েবল / কাস্টম শেপ.এক্সএমএল):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" >
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
        <stroke android:width="8dp" android:color="@android:color/transparent" />
        <padding android:left="14dp" android:top="14dp"
                android:right="14dp" android:bottom="14dp" />
        <corners android:radius="10dp" />
        <gradient 
             android:startColor="@android:color/background_light"
             android:endColor="@android:color/transparent" 
             android:angle="225"/> 
    </shape>
</item>
<item android:state_pressed="false">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
        <stroke android:width="8dp" android:color="@android:color/transparent" />
        <padding android:left="14dp" android:top="14dp"
                android:right="14dp" android:bottom="14dp" />
        <corners android:radius="10dp" />
        <gradient 
             android:startColor="@android:color/darker_gray"
             android:endColor="@android:color/transparent" 
             android:angle="225"/> 
    </shape>        
</item>

তারপরে কাস্টম সিলেক্টরকে ব্যাকগ্রাউন্ড হিসাবে সেট করতে আপনাকে একটি তালিকা অ্যাডাপ্টার প্রয়োগ করতে হবে এবং getView পদ্ধতিটি ওভাররাইড করতে হবে

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //snip
        convertView.setBackgroundResource(R.drawable.customshape);
        //snip
    }

এবং ডিফল্ট নির্বাচক আয়তক্ষেত্রটি যেমন 'অনাকাঙ্ক্ষিত' করা দরকার যেমন অনক্রিয়েটে (আমি আইটেমগুলির মধ্যে আমার পাতলা ধূসর বিভাজক লাইনটিও আড়াল করি):

listView.setSelector(android.R.color.transparent);
listview.setDivider(null);

এই পদ্ধতির মাধ্যমে বিভিন্ন বাছাইয়ের রাজ্যের সাথে তালিকার ভিউ আইটেমটি নয়, আঁকতে সক্ষমদের জন্য একটি সাধারণ সমাধান সমাধান করা হয়।


3

হালনাগাদ

আজকাল সমাধানটি CardViewঅন্তর্নির্মিত গোলাকার কোণগুলির জন্য সমর্থন সহ একটি ব্যবহার করা।


আসল উত্তর *

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


2

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

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

আপনার অন-স্বচ্ছ নির্বাচন হাইলাইট করার প্রয়োজন হলে এটি সবচেয়ে সহজ সমাধান।

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="@color/listbg" />
    <stroke
        android:width="2dip"
        android:color="#D5D5D5" />
    <corners android:radius="10dip" />

    <!-- Make sure bottom and top padding match corner radius -->
    <padding
        android:bottom="10dip"
        android:left="2dip"
        android:right="2dip"
        android:top="10dip" />
</shape>

1

আসলে, আমি মনে করি সেরা সমাধানটি এই লিঙ্কটিতে বর্ণিত হয়েছে:

http://blog.synyx.de/2011/11/android-listview-with-rounded-corners/

সংক্ষেপে, এটি শীর্ষ, মধ্য এবং নীচের আইটেমগুলির জন্য একটি পৃথক পটভূমি ব্যবহার করে, যাতে শীর্ষ এবং নীচের অংশগুলি গোল হয়ে যায়।


1

এটি আমার কাছে অবিশ্বাস্যভাবে কার্যকর ছিল। আপনি যদি নিজের নিজস্ব ব্যবহার করে থাকেন তবে বৃত্তাকার কোণগুলি পুরোপুরি হাইলাইট করার জন্য আমি আরেকটি কাজের প্রস্তাব দিতে চাই CustomAdapter

এক্সএমএল ফাইলগুলি সংজ্ঞায়িত করা হচ্ছে

প্রথমত, আপনার আঁকতে সক্ষম ফোল্ডারের ভিতরে যান এবং 4 টি বিভিন্ন আকার তৈরি করুন:

  • shape_top

    <gradient
        android:startColor="#ffffff"
        android:endColor="#ffffff"
        android:angle="270"/>
    <corners
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"/>

  • shape_normal

    <gradient
        android:startColor="#ffffff"
        android:endColor="#ffffff"
        android:angle="270"/>
    <corners
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"/>

  • shape_bottom

    <gradient
        android:startColor="#ffffff"
        android:endColor="#ffffff"
        android:angle="270"/>
    <corners
        android:bottomRightRadius="10dp"
        android:bottomRightRadius="10dp"/>

  • shape_rounded

    <gradient
        android:startColor="#ffffff"
        android:endColor="#ffffff"
        android:angle="270"/>
    <corners
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"
        android:bottomRightRadius="10dp"
        android:bottomRightRadius="10dp"/>

এখন, প্রতিটি আকারের জন্য একটি পৃথক সারি বিন্যাস তৈরি করুন, যেমন shape_top:

  • আপনি ব্যাকগ্রাউন্ড পরিবর্তনক্রমে এটিকেও করতে পারেন।

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="10dp"
        android:fontFamily="sans-serif-light"
        android:text="TextView"
        android:textSize="22dp" />
    
    <TextView
        android:id="@+id/txtValue1"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:textSize="22dp"
        android:layout_gravity="right|center"
        android:gravity="center|right"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="35dp"
        android:text="Fix"
        android:scaleType="fitEnd" />

এবং প্রতিটি আকারের-তালিকার জন্য নির্বাচককে সংজ্ঞায়িত করুন, যেমন shape_top:

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

    <item android:state_selected="true"
        android:drawable="@drawable/shape_top" />
    <item android:state_activated="true"
        android:drawable="@drawable/shape_top" />

    <!-- Default Item -->
    <item android:state_selected="false"
        android:drawable="@android:color/transparent" />
</selector>

আপনার কাস্টমএডাপ্টার পরিবর্তন করুন

অবশেষে, আপনার ভিতরে বিন্যাস বিকল্পগুলি সংজ্ঞায়িত করুন CustomAdapter:

if(position==0)
{
 convertView = mInflater.inflate(R.layout.list_layout_top, null);
}
else
{
 convertView = mInflater.inflate(R.layout.list_layout_normal, null);
}

if(position==getCount()-1)
{
convertView = mInflater.inflate(R.layout.list_layout_bottom, null);
}

if(getCount()==1)
{
convertView = mInflater.inflate(R.layout.list_layout_unique, null);
}

ওটা হয়ে গেল!


1

সীমানা তৈরি করতে আপনাকে আঁকাযোগ্য ফোল্ডারে শক্ত এবং কোণগুলির সম্পত্তি সহ আরও একটি এক্সএমএল ফাইল তৈরি করতে হবে এবং এটি পটভূমিতে কল করে


0

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

public class RoundedCornersView extends View {
    private float mRadius;
    private int mColor = Color.WHITE;
    private Paint mPaint;
    private Path mPath;

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

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

        TypedArray a = context.getTheme().obtainStyledAttributes(
                attrs,
                R.styleable.RoundedCornersView,
                0, 0);

        try {
            setRadius(a.getDimension(R.styleable.RoundedCornersView_radius, 0));
            setColor(a.getColor(R.styleable.RoundedCornersView_cornersColor, Color.WHITE));
        } finally {
            a.recycle();
        }
    }

    private void init() {
        setColor(mColor);
        setRadius(mRadius);
    }

    private void setColor(int color) {
        mColor = color;
        mPaint = new Paint();
        mPaint.setColor(mColor);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setAntiAlias(true);

        invalidate();
    }

    private void setRadius(float radius) {
        mRadius = radius;
        RectF r = new RectF(0, 0, 2 * mRadius, 2 * mRadius);
        mPath = new Path();
        mPath.moveTo(0,0);
        mPath.lineTo(0, mRadius);
        mPath.arcTo(r, 180, 90);
        mPath.lineTo(0,0);
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {

        /*Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawRect(0, 0, mRadius, mRadius, paint);*/

        int w = getWidth();
        int h = getHeight();
        canvas.drawPath(mPath, mPaint);
        canvas.save();
        canvas.translate(w, 0);
        canvas.rotate(90);
        canvas.drawPath(mPath, mPaint);
        canvas.restore();
        canvas.save();
        canvas.translate(w, h);
        canvas.rotate(180);
        canvas.drawPath(mPath, mPaint);
        canvas.restore();
        canvas.translate(0, h);
        canvas.rotate(270);
        canvas.drawPath(mPath, mPaint);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.