Android - Layer-List Rounded Rectangle Issue - android

I've created a layer-list drawable with overlapping round rectangles to create a shadow but started to noticed a weird issue with the bottom layer peeking thru when the corner radius is used. So as a test, I just layered two rounded rectangles and the behavior exists. Is this a possible issue?
If you look at A, you'll notice the corners displaying the bottom layer's color. I switched the top layer's color to white and as you can see there is something going on here as you can see the corners showing up when they should not. Below is the drawable,
<?xml version="1.0" encoding="utf-8"?>
<item>
<shape>
<solid android:color="#ff0000" />
<corners android:radius="5dp" />
</shape>
</item>
<item>
<shape>
<solid android:color="#ffffff" />
<corners android:radius="5dp" />
</shape>
</item>

Related

Corner Color of a Shape in android

I know the solid color and also the corner section but
I want to know how can I fill color of the corner
Try using stroke in your layout file. stroke can give you the border colour and width.
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<stroke android:color="#color/yourcolour"
android:width="4dp"
/>
//Other adjustments
</shape>
Let me know if this is what you were looking for
Or if you want something like in your image try the below
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item >
<shape android:shape="rectangle">
<solid android:color="#android:color/holo_red_dark"/>
<stroke android:color="#android:color/black"
android:width="10dp"
/>
</shape>
</item>
<item >
<shape android:shape="rectangle">
<solid android:color="#android:color/holo_blue_bright"/>
<stroke android:color="#android:color/black"
android:width="10dp"
/>
<corners android:bottomLeftRadius="150dp"/>
</shape>
</item>
</layer-list>
It seems you talking about that red colour on above image.
In that case, there is no property which give you such result.
You need to make it logically., Like take 2 views with diff background,
Red background with black colour stroke.
Sky background overlaping on 1st red view.
And simply make top view background as rounded with black color stroke. It will provide you the desired design layout.
Make sure you give same stroke to both view so that itlook to be same.
Happy coding.

Change drawable Stroke color programmaticaly in Kotlin - Android Studio

I'm trying to change the color of the stroke of a Drawable that I use as a background.
Here is my drawable:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#color/colorPrimary" />
</shape>
</item>
<item
android:id="#+id/item_border_drawable"
android:left="16dp"
android:right="16dp"
android:top="16dp"
android:bottom="16dp">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- This is the stroke you want to define -->
<stroke android:width="3dp"
android:color="#color/itemLegendary"/>
<!-- Optional, round your corners -->
<corners android:bottomLeftRadius="0dp"
android:topLeftRadius="5dp"
android:bottomRightRadius="5dp"
android:topRightRadius="0dp" />
</shape>
</item>
</layer-list>
As you can see I use an item Rectangle to have a Background color, then another rectangle on top that draws a border around it but with 16dp of margin all around.
I want to change the color of the stroke in the MainActivity, without affecting the padding and background-color.
I tried to do as mentionned here:
Android change color stroke (border) programmatically
However it seems like it doesnt "change the color" but replace the whole Drawable and I don't want to have to give the information of the padding etc... once again.
Could you guys please help me to easily change the color of the border?
Regards.

Android Drawable overlay shape

I'm trying to create a drawable overlay shape control that will basically have a solid WHITE box at the top and then the remaining segment of the screen will have a gradient from a solid white down to a translucent white. We use this to lay over a background image to create a solid white area on top and then fading into the a background image towards the bottom.
Using this code it gets basically what I want, except I want a true solid white area under the Company Logo area (sorry I had to blank out the Company Logo and the App Name in the screen shot) with the gradient starting below the solid white.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="270"
android:startColor="#ffffffff"
android:centerColor="#00ffffff"
android:endColor="#00ffffff"
android:centerY="0.6"
android:type="linear" />
</shape>
</item>
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#ffffffff"
android:centerColor="#ffffffff"
android:endColor="#00ffffff"
android:centerY="-0.17"
android:gradientRadius="100%p"
android:type="radial" />
</shape>
</item>
</layer-list>
Which produces a display similar to this:
But I really want a more solid white area to be directly under the Company Logo area and then with the gradient starting after that point. But you can see that the gradient is starting at the top of the screen.
I've tried to do something like the following but it's not working. Adding the first item in the list does give me a solid area at the top, but for some reason that I'm probably just not understanding is that the top item fills in the entire screen with the solid white color. I tried moving that first item to the bottom but that still gave me the full solid white screen.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item >
<shape
android:shape="rectangle">
<size android:height="100dp" />
<solid android:color="#ffffffff"/>
</shape>
</item>
<item android:top="100dp" >
<shape
android:shape="rectangle">
<gradient
android:angle="270"
android:startColor="#ffffffff"
android:centerColor="#00ffffff"
android:endColor="#00ffffff"
android:type="linear" />
</shape>
</item>
<item android:top="100dp" >
<shape
android:shape="rectangle">
<gradient
android:startColor="#ffffffff"
android:centerColor="#ffffffff"
android:endColor="#00ffffff"
android:centerY="-0.17"
android:gradientRadius="100%p"
android:type="radial" />
</shape>
</item>
</layer-list>
Can anyone tell me what I'm doing wrong or give me a better way to do this.
Just for additional information. The actual image is being applied to the background of the base LinearLayout view. Then another view is overlayed on top of the base view with this drawable set as the background on it's LinearLayout so it acts as an overlay mask on top of the background image.
I appreciate any help I can get on this.
You can add two Linear Layouts children to one Relative Layout parent. Have the top Linear Layout have the background of white, and the bottom one your gradient.

How to create a border on one edge of a view?

I have found that to add borders around views I can use the following code as a background for the view:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<stroke android:width="1dp" android:color="#999999" />
<padding android:left="1dp" android:top="1dp" android:right="1dp"
android:bottom="1dp" />
</shape>
But what if I want a border just for bottom, or top or right or left? I tried the following:
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<stroke android:color="#000"/>
</shape>
but when I set it as background
android:background="#drawable/my_border"
it draws the line at the middle of the view, so I have a strike-through effect. Is there any way I can draw this line at the bottom or at the top or make it vertical?
In WPF we have a relative coordinates for shapes, so I can offset lines as needed. Is there something similar on Android? If we don't have borders, at least we should have good line shape drawing tools, so we can draw borders as needed. Do Android developers plan to do something about it?
For border line on the top or bottom of you view, you can check my previous answer here. It is a very simple way.
Are u looking for this:
<item android:state_pressed="false">
<inset
android:insetBottom="-3dp"
android:insetLeft="-3dp"
android:insetTop="-3dp" >
<shape >
<corners android:radius="0.0dip" />
<stroke android:width="2.0dip" android:color="#EEE"/>
</shape>
</inset>
</item>
it will show a border only at the right. And u have to set it as the background

How can I work around Android issue 9161, where bottomRightRadius and bottomLeftRadius are swapped?

My goal:
Figure 1: The Goal
So, before I knew about the issue, here's what I tried.
First, a base layout:
<LinearLayout
android:orientation="horizontal"
android:layout_below="#id/heading"
android:layout_marginTop="10dp"
android:layout_width="#dimen/horizontal_two_button_width"
android:layout_height="#dimen/button_height_small" >
<Button
android:id="#+id/button_one"
android:layout_width="0dp"
android:layout_weight="1.0"
android:layout_height="fill_parent"
android:padding="10dp"
style="#style/ButtonText"
android:background="#drawable/button_left_green" />
<Button
android:id="#+id/button_two"
android:layout_width="0dp"
android:layout_weight="1.0"
android:layout_height="fill_parent"
android:padding="10dp"
style="#style/ButtonText"
android:background="#drawable/button_right_green" />
</LinearLayout>
The 'button_left_green' drawable:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/button_left_green_pressed"
android:state_pressed="true" />
<item android:drawable="#drawable/button_left_green_focused"
android:state_focused="true" />
<item android:drawable="#drawable/button_left_green_default" />
</selector>
And, for example, the 'button_left_green_default' drawable:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#color/shadow" />
<corners
android:radius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="0dp"
android:bottomLeftRadius="5dp"
android:bottomRightRadius="0dp" />
</shape>
</item>
<item
android:bottom="19dp"
android:top="1dp"
android:left="1dp"
android:right="1dp" >
<shape android:shape="rectangle">
<gradient
android:startColor="#color/button_left_green_top_gradient_start"
android:endColor="#color/button_left_green_top_gradient_end"
android:angle="270" />
<corners
android:radius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="0dp"
android:bottomLeftRadius="0dp"
android:bottomRightRadius="0dp" />
</shape>
</item>
<item
android:top="19dp"
android:bottom="1dp"
android:left="1dp"
android:right="1dp" >
<shape android:shape="rectangle" >
<solid android:color="#color/button_left_green_bottom_gradient" />
<corners
android:radius="5dp"
android:topLeftRadius="0dp"
android:topRightRadius="0dp"
android:bottomLeftRadius="5dp"
android:bottomRightRadius="0dp" />
</shape>
</item>
</layer-list>
So, after all that, I got the image in Figure 2:
Figure 2: Take One
After double-checking the definition of the bottom corners, I was convinced I was crazy until I found the known issue: http://code.google.com/p/android/issues/detail?id=9161
I'd rather not just swap them, 'cause then if/when the issue is fixed, the buttons will be broken in newer versions.
One idea I had was to leave the actual buttons as regular rectangles (i.e. no corner radii) and wrapping both buttons with a rounded rectangle. I added a background drawable to the LinearLayout which had rounded corners, but the button corners overlapped the edge of the LinearLayout rounded edge (see Figure 3).
Figure 3: Take Two
How can I keep the button's background within the bounds of its parent's background drawable? Or do you have any other suggestions on how to work around the bug?
Another solution is to create another folder called "drawable-v12".
In here put the correct radius (so bottomLeftRadius, topLeftRadius), and in the original drawable folder put in the swapped values. Then 3.1+ will use the v12 folder, and pre 3.1 versions will use the drawable folder.
This feels like such a hack, but it worked.
The buttons were originally made up of (1) an outer shadow, (2) a top-half gradient and (3) a bottom solid color. Here's what I did:
Made the top and bottom halves each rounded on all four corners. This left (1) a gap in the middle of the left and right sides and (2) rounded corners on the right.
Created a small rectangle to fill in the gap in the left middle.
Created another small rectangle to both fill in the gap in the right middle and make the top and bottom corners on the right side square.
Here's an example of the XML for the normal state of the left button.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Main part of button -->
<item
android:bottom="20dp"
android:right="5dp" >
<shape android:shape="rectangle">
<solid android:color="#color/button_normal_green_top" />
<corners android:radius="5dp" />
</shape>
</item>
<item
android:top="20dp"
android:right="5dp" >
<shape
android:shape="rectangle" >
<solid android:color="#color/button_normal_green_bottom" />
<corners android:radius="5dp" />
</shape>
</item>
<!-- Patch left middle part of button, which was left empty due to rounded
corners on top and bottom halves of button -->
<item
android:top="5dp"
android:bottom="20dp"
android:right="5dp" >
<shape android:shape="rectangle">
<solid android:color="#color/button_normal_green_top" />
</shape>
</item>
<item
android:top="20dp"
android:bottom="5dp"
android:right="5dp" >
<shape
android:shape="rectangle" >
<solid android:color="#color/button_normal_green_bottom" />
</shape>
</item>
<!-- Patch right middle and make right side corners square -->
<item
android:bottom="20dp"
android:left="15dp" >
<shape android:shape="rectangle">
<solid android:color="#color/button_normal_green_top" />
</shape>
</item>
<item
android:top="20dp"
android:left="15dp" >
<shape android:shape="rectangle" >
<solid android:color="#color/button_normal_green_bottom" />
</shape>
</item>
</layer-list>
I did, however, lose the gradient on the top half, but I can live with the two-tone button. Here's what the result looks like:
This appears to have been fixed in Android 3.0. And there's a comment on the issue that explains how to have backwards compatibility.
It should work if we provide already left right swapped configuration; so that bug swap will restore the configuration required, as below for left only curved, and righ sharp edged button
<corners android:radius="2dp" android:topLeftRadius="2dp"
android:topRightRadius="0dp" android:bottomLeftRadius="0dp"
android:bottomRightRadius="2dp">
A better solution:
Create another folder values-12
Create dimensions.xml file under values-12.
Put 2 dimension properties in values-12/dimensions.xml for the bottom left, and
bottom right corner radius.
Put 2 dimension properties in values/dimensions.xml for bottom left, and bottom right corner radius values, but remember to flip them.
Use the dimension values when assigning corner radius instead of hardcoding them in your drawables. When a pre 3.1 loads, it will use the reversed corner radius values under folder values. When 3.1+ loads, it will use correct corner radius values under folder values-12.
Why is this better? You don't need to duplicate drawable code. Now you can change any code not related to corner radiuses without having to update 2 or more places.

Categories

Resources