De verloopradius als percentage van de schermgrootte

Ik probeer een vorm te maken die kan worden getekend met een radiale gradiëntachtergrond, met een straal die zich aanpast aan de schermgrootte (neem een ​​kijkje naar de relevante documentation ).

Dit is mijn code:

<?xml version="1.0" encoding="utf-8"?>


    

Maar het lijkt niet te werken. als ik de "% p" verwijder, werkt het, maar dan is de straal statisch, dus niet aangepast aan de schermgrootte ... Enig idee wat is er mis?

34
gradientRadius is een eigenschap die is gebaseerd op een geheel getal. Een percentage of een andere meetwaarde instellen, werkt niet. Ik weet dat dit niet het antwoord is waarnaar je op zoek bent, maar het zal in ieder geval helpen om te bepalen waar je naar op zoek bent.
toegevoegd de auteur Sababado, de bron
Percentages worden niet ondersteund voor de dimensiewaarden van Android. Het is al eerder duidelijk gemaakt: groups.google.com/forum !/# msg/android-ontwikkelaars/EZL4n2mrpds & zwnj;/& hellip;
toegevoegd de auteur S.D., de bron
Zelfde probleem hier (althans bij het bekijken van een voorbeeld van mijn lay-out in Eclipse): het verloop wordt niet toegepast als de straal gespecificeerd is met % of % p
toegevoegd de auteur Sébastien, de bron
Het slechtste deel is dat het niet werkt, zelfs als ik een bron met gehele getallen heb die elders is gedefinieerd, en hiernaar verwijs (@ integer/gradientRadius). Het lijkt alleen absolute gecodeerde gehele getallen te accepteren.
toegevoegd de auteur Gunanaresh, de bron

4 antwoord

Van wat ik heb getest, werkt de % wel, maar niet zoals je verwachtte.
Allereerst

android:gradientRadius="50"

lijkt de waarde te nemen als pixels 50px

android:gradientRadius="50%"

wordt geconverteerd alsof 50% = 0,5 px, probeer

android:gradientRadius="5000%"

en je ziet een straal van 50px.
Het gebruik van % p heeft een vergelijkbaar resultaat. Uiteraard is dit iets waarvan ik hoop dat het in de toekomst zal worden veranderd, omdat het niet veel nut heeft zoals het is. Gewoonlijk passen xml ShapeDrawable-middelen hun grootte aan een externe container aan, in dit geval is de gradientRadius de grootte, ongeacht de container.

11
toegevoegd
Een betere oplossing is om waarden-mdpi, waarden-hdpi-mappen te gebruiken en verschillende dimenwaarden op te geven en ernaar te verwijzen in het veld radiuswaarde.
toegevoegd de auteur Ajith Memana, de bron
"50000% p" is hetzelfde als "50", zoals ilomambo al eerder zei, dus als je wat leesbaarheid wilt, moet je het niet gebruiken.
toegevoegd de auteur Joan, de bron

Uiteindelijk heb ik een aangepaste weergave gemaakt met de volgende overriden onDraw-methode:

@Override
protected void onDraw(Canvas canvas) {
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

    int maxSize = Math.max(getHeight(), getWidth());
    RadialGradient gradient = new RadialGradient(
            getWidth()/2,
            getHeight()/2,
            maxSize, 
            new int[] {Color.RED, Color.BLACK},
            new float[] {0, 1}, 
            android.graphics.Shader.TileMode.CLAMP);

    paint.setDither(true);
    paint.setShader(gradient);

    canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
}

Voeg in je lay-out gewoon de weergave toe:


Natuurlijk is het mogelijk om attributen voor de weergave te maken, bijvoorbeeld. kleur, percentage om aanpassingen via xml mogelijk te maken.

8
toegevoegd

Merk op dat gradiëntRadius-percentages werken in Lollipop. Maar als je pre-Lollipop moet ondersteunen, breidde ik het antwoord van @ marnaish uit met toevoeging van XML-attributen. Mijn verloopRadius is gedefinieerd als een percentage van de breedte van de bovenliggende weergave:

public class RadialGradientView extends View {
    private final int endColor;
    private final int startColor;
    private final float gradientRadiusWidthPercent;
    private final float centerY;
    private final float centerX;
    private Paint paint;

    public RadialGradientView(Context context, AttributeSet attrs) {
        super(context, attrs);

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

        startColor = a.getColor(R.styleable.RadialGradientView_startColor, Color.RED);
        endColor = a.getColor(R.styleable.RadialGradientView_endColor, Color.BLACK);
        gradientRadiusWidthPercent = a.getFloat(R.styleable.RadialGradientView_gradientRadiusWidthPercent, 1);
        centerX = a.getFloat(R.styleable.RadialGradientView_centerX, .5f);
        centerY = a.getFloat(R.styleable.RadialGradientView_centerY, .5f);

        a.recycle();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);

        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        RadialGradient gradient = new RadialGradient(
                parentWidth*centerX,
                parentHeight*centerY,
                parentWidth*gradientRadiusWidthPercent,
                new int[] {startColor, endColor},
                null,
                android.graphics.Shader.TileMode.CLAMP);

        paint.setDither(true);
        paint.setShader(gradient);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
    }

}

In attrs.xml:


    
    
    
    
    

Helaas kun je geen XML-tekenbaar vanuit een aangepaste klasse maken, dus je kunt het niet instellen als de Android-achtergrond van View: background. De tijdelijke oplossing is om een ​​FrameLayout te gebruiken om het als achtergrond te gebruiken.



    
    

5
toegevoegd

You could create a shape drawable at runtime similiar to this post https://stackoverflow.com/a/4943888/604504

Op deze manier kunt u het percentage berekenen na het ophalen van de schermgrootte.

0
toegevoegd