উত্তর:
এটি করার একটি উপায় এখানে রয়েছে (যদিও অ্যান্ড্রয়েড ডকুমেন্টেশনের জন্য ধন্যবাদ!):
নিম্নলিখিতটি কোনও ফাইলে যুক্ত করুন (কাস্টম শেপ.এক্সএমএল বলুন) এবং তারপরে এটি স্থাপন করুন (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"
আশা করি কেউ এটি দরকারী হিসাবে ...
যদিও এটি কাজ করে, এটি পুরো পটভূমির রঙটিও বের করেছে। আমি কেবল সীমান্ত করার জন্য একটি উপায় খুঁজছিলাম এবং কেবলমাত্র এটির সাথে এই এক্সএমএল লেআউট কোডটি প্রতিস্থাপন করেছি এবং আমি যেতে ভালই লাগলাম!
<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>
@ ক্রিস-ভ্যান-বেল
শীর্ষ এবং নীচের সারির জন্য নির্বাচনের হাইলাইট নিয়ে সমস্যা রয়েছে তাদের জন্য যেখানে ব্যাকগ্রাউন্ড আয়তক্ষেত্রটি নির্বাচনের উপরে প্রদর্শিত হবে আপনার তালিকা তালিকাটি স্বচ্ছ বর্ণের জন্য আপনাকে নির্বাচক সেট করতে হবে।
listView.setSelector(R.color.transparent);
Color.xML এ কেবল নিম্নলিখিতটি যুক্ত করুন -
<color name="transparent">#00000000</color>
android:cacheColorHint="@android:color/transparent"
অন্যান্য উত্তরগুলি খুব দরকারী, লেখকদের ধন্যবাদ!
তবে আমি দেখতে পাচ্ছিলাম না যে আয়তক্ষেত্রটি কাস্টমাইজ করার সময় কোনও আইটেমটি নির্বাচনের সময় হাইলাইট করা @ আলভিনস @ ভারত দোজেহাকে অক্ষম করার চেয়ে।
নিম্নলিখিত আকারটি একই আকারের জন্য নির্বাচিত হওয়ার পরে কোনও আউটলাইন এবং একটি হালকা ধূসর ছাড়া গোলাকার তালিকার ভিউ আইটেম ধারক তৈরি করতে আমার পক্ষে কাজ করে:
আপনার এক্সএমএলে একটি নির্বাচক থাকতে হবে যেমন যেমন (রেজো / ড্রইয়েবল / কাস্টম শেপ.এক্সএমএল):
<?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);
এই পদ্ধতির মাধ্যমে বিভিন্ন বাছাইয়ের রাজ্যের সাথে তালিকার ভিউ আইটেমটি নয়, আঁকতে সক্ষমদের জন্য একটি সাধারণ সমাধান সমাধান করা হয়।
হালনাগাদ
আজকাল সমাধানটি CardView
অন্তর্নির্মিত গোলাকার কোণগুলির জন্য সমর্থন সহ একটি ব্যবহার করা।
আসল উত্তর *
আর একটি উপায় আমি খুঁজে পেয়েছি হ'ল লেআউটটির শীর্ষে একটি চিত্র অঙ্কন করে আপনার বিন্যাসটি আটকানো। এটি আপনাকে সাহায্য করতে পারে। পরীক্ষা করে দেখুন ছাঁটা কোণে গোলাকার অ্যান্ড্রয়েড এক্সএমএল
নির্বাচনের আরেকটি সমাধান হ'ল তালিকার প্রথম এবং শেষ আইটেমগুলির সাথে সমস্যাগুলি হাইলাইট করে:
ব্যাসার্ধের সমান বা তার চেয়ে বেশি আপনার তালিকার পটভূমির উপরে এবং নীচে প্যাডিং যুক্ত করুন। এটি নিশ্চিত করে যে নির্বাচনের হাইলাইটিংটি আপনার কোণার রেখার সাথে ওভারল্যাপ না হয়।
আপনার অন-স্বচ্ছ নির্বাচন হাইলাইট করার প্রয়োজন হলে এটি সবচেয়ে সহজ সমাধান।
<?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>
আসলে, আমি মনে করি সেরা সমাধানটি এই লিঙ্কটিতে বর্ণিত হয়েছে:
http://blog.synyx.de/2011/11/android-listview-with-rounded-corners/
সংক্ষেপে, এটি শীর্ষ, মধ্য এবং নীচের আইটেমগুলির জন্য একটি পৃথক পটভূমি ব্যবহার করে, যাতে শীর্ষ এবং নীচের অংশগুলি গোল হয়ে যায়।
এটি আমার কাছে অবিশ্বাস্যভাবে কার্যকর ছিল। আপনি যদি নিজের নিজস্ব ব্যবহার করে থাকেন তবে বৃত্তাকার কোণগুলি পুরোপুরি হাইলাইট করার জন্য আমি আরেকটি কাজের প্রস্তাব দিতে চাই 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);
}
ওটা হয়ে গেল!
আমি একটি কাস্টম ভিউ ব্যবহার করছি যা আমি অন্যগুলির উপরে লেআউট করি এবং এটি পটভূমির মতো একই বর্ণের 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);
}
}