मुझे लगता है कि विकल्प 3 सबसे अच्छा, क्या आप वास्तव में क्या ड्राइंग कर रहे हैं, लेकिन तुम नहीं ढीला OOP कर्म अंक
विकल्प 1
आप के लिए एक कस्टम View
बना सकते हैं नियंत्रित कर सकते हैं अपने शीर्ष View
और अपने आप को इस तरह ड्राइंग, मैं कर रहा हूँ उपवर्गीकरण RelativeLayout
यहाँ लागू लेकिन आप उपवर्ग कर सकते हैं जो कुछ भी आप चाहते हैं View
public class CurveBgRelativeLayout extends RelativeLayout {
public CurveBgRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
private Path path;
private Paint paint;
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL);
paint.setColor(0xffff0000);
path = new Path();
float horizontalOffset = w * .8f;
float top = -h * .8f;
float bottom = h;
RectF ovalRect = new RectF(-horizontalOffset, top, w + horizontalOffset, bottom);
path.lineTo(ovalRect.left, top);
path.arcTo(ovalRect, 0, 180, false);
path.setFillType(Path.FillType.INVERSE_EVEN_ODD);
}
@Override
protected void onDraw(Canvas canvas) {
if (path != null)
canvas.drawPath(path, paint);
super.onDraw(canvas);
}
}
और फिर अपने XML लेआउट में
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.CurveBgRelativeLayout
android:layout_width="match_parent"
android:background="#ffffffff"
android:layout_height="0dp"
android:layout_weight="1"/>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#ffff0000"
/>
</LinearLayout>
विकल्प 2
आप अपने शीर्ष View
के लिए एक पृष्ठभूमि के रूप में एक xml drawable बना सकते हैं, समस्या सिर्फ यहाँ है कि की क्षैतिज खिंचाव वृत्त डी पी में एक आकार के साथ दिया जाता है, तो यह View
के आकार
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:height="40dp"
android:gravity="bottom">
<shape android:shape="rectangle">
<solid android:color="#ffff0000" />
</shape>
</item>
<item
android:width="500dp"
android:height="60dp"
android:gravity="bottom|center_horizontal"
android:top="-40dp">
<shape android:shape="oval">
<solid android:color="#ffffffff" />
</shape>
</item>
<item
android:height="30dp"
android:bottom="30dp"
android:gravity="bottom">
<shape android:shape="rectangle">
<solid android:color="#ffffffff" />
</shape>
</item>
</layer-list>
के सापेक्ष नहीं है विकल्प 3
public class CurveBottomDrawable extends Drawable {
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Path path = new Path();
public CurveBottomDrawable(int color) {
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
}
@Override
public void draw(@NonNull Canvas canvas) {
paint.setStyle(Paint.Style.FILL);
paint.setColor(0xffff0000);
path.reset();
Rect bounds = getBounds();
float horizontalOffset = bounds.width() * .8f;
float top = -bounds.height() * .8f;
float bottom = bounds.height();
RectF ovalRect = new RectF(-horizontalOffset, top, bounds.width() + horizontalOffset, bottom);
path.lineTo(ovalRect.left, top);
path.arcTo(ovalRect, 0, 180, false);
path.setFillType(Path.FillType.INVERSE_EVEN_ODD);
canvas.drawPath(path, paint);
}
@Override
public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {
paint.setAlpha(alpha);
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSPARENT;
}
}
और फिर इसे प्रोग्राम के रूप में सेट एक कस्टम `Shape` वर्ग` ShapeDrawable` निर्माता को पारित कर दिया (सबसे अधिक संभावना आप आकर्षित करेगा के साथ एक `ShapeDrawable` बनाने के लिए
myView.setBackground(new CurveBottomDrawable(0xffff0000));
कोशिश यह 'पथ # क्वाडटो' विधि – pskink
आपकी मदद के लिए धन्यवाद, मैं –
को केवल स्पष्टता के लिए पूछूंगा कि आपको अपने प्रश्न पर दिए गए छवि की तरह आउटपुट की आवश्यकता है? –