2017-03-11 5 views
6

मेरे गतिविधि इस तरह दिखना चाहिए:दृश्य [एंड्रॉइड] के नीचे सर्कल के सेगमेंट को कैसे आकर्षित करें?

मुझे यकीन है कि ऊपर और नीचे विचारों के बीच वृत्त के खंड को दिखाने के लिए सबसे अच्छा तरीका क्या नहीं कर रहा हूँ।

मैं सेगमेंट को छवि के रूप में सहेजने से बचाना चाहता हूं।

drawable xml का उपयोग करके इसे दिखाने का कोई तरीका है (मैंने oval का उपयोग करके इसे प्राप्त करने का प्रयास किया है, लेकिन मुझे नहीं पता कि कैसे "फ्लैट" बनाना है)?

शायद canvas पर ड्राइंग?

+0

कोशिश यह 'पथ # क्वाडटो' विधि – pskink

+0

आपकी मदद के लिए धन्यवाद, मैं –

+0

को केवल स्पष्टता के लिए पूछूंगा कि आपको अपने प्रश्न पर दिए गए छवि की तरह आउटपुट की आवश्यकता है? –

उत्तर

9

मुझे लगता है कि विकल्प 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)); 
+0

मुझे लगता है कि 'ऑनड्रा()' नहीं कहा जाएगा क्योंकि 'setWillNotDraw (false)' नहीं किया गया है। – azizbekian

+0

बहुत बहुत धन्यवाद, पहला विकल्प वह है जिसे मैं –

+0

@lelloman के लिए देख रहा था, मैंने पहले समाधान की जांच की है। यह 'setWillNotDraw (false)' के बाद काम शुरू करेगा, अन्यथा 'ViewGroup'' onDraw() 'नहीं कहा जाएगा। – azizbekian

संबंधित मुद्दे