2011-04-29 19 views
7

Próbuję utworzyć widok z zaokrąglonymi narożnikami (i wybranym kolorem tła), który mogę ponownie wykorzystać w różnych kolorach tła; Trudno to wyjaśnić, więc tutaj jest mój kod:Widok niestandardowego składnika Android z zaokrąglonymi rogami

/app/src/com/packagename/whatever/CustomDrawableView.java


package com.packagename.whatever; 

import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Canvas; 
import android.graphics.drawable.PaintDrawable; 
import android.util.AttributeSet; 
import android.view.View; 

public class CustomDrawableView extends View { 
    private PaintDrawable mDrawable; 
    int radius; 

    private void init(AttributeSet attrs) { 
     TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.RoundedRect); 
     radius = a.getInteger(R.styleable.RoundedRect_radius, 0); 
    } 

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

     mDrawable = new PaintDrawable(); 
    } 

    protected void onDraw(Canvas canvas) { 
     mDrawable.setCornerRadius(radius); 
     mDrawable.draw(canvas); 
    } 
} 

Oto XML, aby wyświetlić niestandardowy komponent: /app/res/layout/test.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:ny="http://schemas.android.com/apk/res/com.packagename.whatever" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#ffffff" 
    android:padding="10dp"> 

    <com.packagename.whatever.CustomDrawableView 
     android:id="@+id/custom" 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:background="#b80010" 
     ny:radius="50" 
    /> 

</LinearLayout> 

ja chce czerwone pole, aby mieć 50px zaokrąglone narożniki, ale jak zobaczysz, to nie:

Red box without rounded corners

Chodzi o to, że mogę łatwo zmienić kolor tła w pliku XML i automatycznie mieć ładny widok z zaokrąglonymi narożnikami, bez konieczności tworzenia wielu kanału alfa.

Dzięki za pomoc!

+0

Wypróbuj http://www.gadgetsaint.com/tips/rounded-corners-views-layouts-android/#.WPz2QVN97BI – ASP

Odpowiedz

8

Musisz ustawić swój promień narożnika i kolor na tło ciągnione.

Oto jeden ze sposobów, który zadziała. Chwyć kolor ustawiony w Androidzie: tło, a następnie użyj go do utworzenia nowej szuflady ustawionej w tle w konstruktorze. To zadziała tak długo, jak tylko ustawisz android: tło na wartość koloru.

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

     // pull out the background color 
     int color = attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android", "background", 0xffffffff); 

     // create a new background drawable, set the color and radius and set it in place 
     mDrawable = new PaintDrawable(); 
     mDrawable.getPaint().setColor(color); 
     mDrawable.setCornerRadius(radius); 
     setBackgroundDrawable(mDrawable); 
    } 

Jeśli zastąpić OnDraw, upewnij się, zadzwoń super.onDraw (canvas) pierwsza, aby uzyskać tło narysowane.

+0

To się udało! Dziękuję Ci!! – iamkoa

2
+0

Dziękuję za odpowiedź, ale próbuję dynamicznie ustawić kolor tła. Twoje pierwsze dwa łącza są metodami, których normalnie używam, ale pozwalają tylko na statyczne bg, stąd mój problem. Trzecie łącze może załatwić sprawę ... Przyjrzę się. :) – iamkoa

+0

@iamkoa wywołanie 'setBackgoundColor()' potem nie działa? – Aleadam

+0

Tak, ale to wymagałoby dodania androida: tła do rysowania, a następnie ręcznego przesłonięcia koloru tła w języku Java, prawda? Szukam rozwiązania, które pozwala wszystkim być w jednym wywołaniu XML. – iamkoa

3

danego prosty shapedrawable tak:

public ShapeDrawable Sd(int s){ 

float[] outerR = new float[] { 12, 12, 12, 12, 12, 12, 12, 12 }; 
ShapeDrawable mDrawable = new ShapeDrawable(new RoundRectShape(outerR, null,null)); 

      mDrawable.getPaint().setColor(s); 
return mDrawable; 
} 

można wykonaj następujące czynności:

LinearLayout l=(LinearLayout) findViewById(R.id.testLayout); 
l.setBackgroundDrawable(Sd(0xff74AC23)); 

gdzie 12 oznaczają promień. można zastosować to do dowolnego widoku dla tła do pobrania.

+0

jeśli już masz kolorowe przyciski i musisz zaokrąglić je w rogach używam tego kodu Resource res = this.getResources(); button2.setBackgroundDrawable (this.Sd (res.getColor (R.color.color1x2))); – max4ever

Powiązane problemy