Understanding the hidden cost of transparency on Android - android

I'm watching the video https://youtu.be/wIy8g8yNhNk
My first question.
As far as I understand from the video, when we draw a View that is opaque, we just put data, roughly speaking, a bitmap to the screen. That's called rendering. Is that right?
My second question.
Now let's draw a TextView with an opaque background an a semi-transparent text. Why should it be a two-step process as described in the video: we draw the TexView opaque and then apply a new alpha value to make text semi-transparent? Is it just the way Android was designed? Why can't we draw a semi-transparent pixel in one step?
My third question.
Here Ian Ne-Lewis's telling us about a view with two parts: opaque (on top) and semi-transparent (below the opaque part). He says the two parts don't overlap. But the opaque part is on top of the semi-transparent part. So why does he say these views don't overlap? As far as I understand, by "overlapping" he means having something semi-transparent on top of something opaque.

Answering your first question:
Rendering is the process executed by the Android Framework when it is drawing your opaque View on the screen.
Second Question
To render that TextView, Android will first draw the opaque background and then the semi-transparent Text. And as you saw on the video: When rendering alpha layers, android has to redraw the background layers to see what color should the alpha blend to.
That's just the way Android was designed. Even if both the background and the text were opaque, Android would first draw the background and then the text (but this time it doesn't need to check the background to blend).
Third Question
I think you didn't understand correctly the meaning of overlapping. Here's an example:

Related

How can i create a border on custom view with many drawing shapes

I want to apply the border to this custom view shape
which created by many canvas.draw...() in onDraw()
The border that i want to create and apply to my custom view should have equal range all the way with some distance from the custom view and it should also cover small circle in each slice.
Any idea how to make this?
Thanks.
This isn't so much an answer, but more of a recommendation. Take a look at the Porter-Duff modes available to you. Worst case you may need to do some per pixel image manipulation which should be fine as long as the view isn't animated.
On second thought, here's an idea: why not create two images: one large circle which will always draw behind everything and a second which will always draw behind the small circles. The large circle would just be the complete border you want displayed, whereas the small circles would actually only be a semi circle border, which would render on top of the large circle (covering the large circle border under it). The key would then be to rotate the small border circle depending on where it's located. I hippie that makes sense, but it should work and be very efficient too.
Another option would be to separate the rendering into white circles and slightly larger border color circles. If you render the slightly larger (border color) circles first, then render the normal circles (white) on top, then you won't have to worry about any rotations and it will render correctly if the small outer circles begin to overlap.
So the idea is similar to the first suggestion. You'll still need a large circle and small circle (both white), but in addition, you'll need slightly larger border colored large and small circles.
I hope this description is a little clearer, but I assume that you are comfortable enough with compound drawables to figure out the rest, given that you've gotten this far in making your view.
All the best implementing it, and feel free to ask for any clarification! :)

Transparent textures in Android OpenGL

I'm trying to make an app in Android in which you can put different tipes of clothes on different characters.To do this i have made a square on which i put a texture (the character) with transparency (so you ca see the background, arround him) and then i added another square where the texture is the piece of clothing.The problem is that both squares with their specific textures show the backgroud, but the second square does not show the square behind him.
I guess my question is how can i make the second square show the first square and the background on the transparent parts?
make use of the Alpha component. which adds transparency to the pixel.
Look at this linkvwhich help you better

Setting background colour for a SurfaceView in Android

I am building a paint application for android. Extending the FingerPaint application sample provided with the SDK. However, unlike FingerPaint, I'm using SurfaceView with a separate rendering thread to draw to the surface. All this is very standard and straightforward. Working well. I want to, however, give a White coloured background to the painting surface, so it's like drawing on a white paper. The default background is black coloured.
The thread of my surface view, calls the onDraw() method of the view.
The problem I'm facing here is, if I set a background colour or background resource to my SurfaceView, this background overwrites the previous drawing of the surface, when the view is rendered the next time. I will explain this with an example:
Suppose I set the background to white colour. Now, the application starts, with my SurfaceView having the white colour. Ok, so far good. Now, I draw a red coloured line on this surface, with my finger. The line is now shown on the white surface. Good. Now, this is supposed to be a painting app, and suppose I want to draw a car. So, then, I draw my 2nd red line, with my finger. The 2nd line is drawn on the screen, but the 1st one, which I drew previously, vanishes. That is, because I have set some background to my SurfaceView, the background is drawn again, thus overwriting the 1st line that was drawn. Now the screen shows only the 2nd line drawn.
Obviously, I do not want this to happen. The code works perfectly, when I don't attempt to change the background (that is, both lines are shown, on a default black background, no background effectively). But when I set some desired background, this thing happens. Is there a way to somehow have a static background, that is not drawn every time? I want the background to be drawn only once, all the subsequent drawings should happen on this background. I don't want the android runtime , to draw the background, every time it draws my view, thus overwriting all drawing present on that view, from previous renderings. Any way to work around this?
The things I have tried, to achieve this are:
Setting the background colour of my SurfaceView using android:background in XML.
Doing the above, using the concept of style. (specifying a style value and referencing it in the layout file). The style just defines the background colour as #FFFFFFFF (white).
Setting the style of 2, to the parent view of the SurfaceView (a RelativeLayout).
Setting the style of 2, to the entire application, as a theme,using android:theme in my manifest file.
Setting the background drawable of my SurfaceView to an image which is plain and white-coloured.
Calling the setBackgroundColor for my SurfaceView from the code as, this.setBackgroundColor(Color.WHITE).
Thanks.
according to android's doc:
The surface is Z ordered so that it is behind the window holding its
SurfaceView; the SurfaceView punches a hole in its window to allow its
surface to be displayed. The view hierarchy will take care of
correctly compositing with the Surface any siblings of the SurfaceView
that would normally appear on top of it. This can be used to place
overlays such as buttons on top of the Surface, though note however
that it can have an impact on performance since a full alpha-blended
composite will be performed each time the Surface changes
so if you change the z order of surface view via:
setZOrderOnTop(true);
this will work, but then you cannot put any other view on top of surface view.
Now I also tried overlaying my SurfaceView over another View with a white background, and setting the SurfaceView to be fully transparent. I used FrameLayout for this. That is, a View with a white background, overlayed upon which is my SurfaceView set to fully transparent.
This also failed to work. So now I have come to conclusion that the background colour of SurfaceView cannot be changed. So now I have dropped SurfaceView, and using a normal view, instead for my drawings. So far, there has not been any performance loss observed. But, it feels kind of wrong to drop an efficient implementation , just because SurfaceView doesn't let me change it's background colour.

Android: overridePendingTransition Animation Background Color

Trying to use overridePendingTransition to apply custom animations to my activity changes. The problem is that my themed app uses colored backgrounds in the activities, and while animating a black background is visible while one view scales out and another scales in.
I would like to know if it is possible to specify the default background color here, and also if I can make it skinnable.
Any help would be greatly appreciated.
Thanks,
Josh
The animations you supply are only window animations -- they describe how to move the entire window/activity surfaces. There is no concept of a background or other such thing, just 2d transformations (and alpha fades) being applied to the entire window surface.
Further, you need to be careful when creating such animations that when you put them together the two windows are always entirely covering the screen, because there is nothing behind your application to provide a background. Thus any such animation typically needs to involve one of the windows remaining opaque if another is fading, and if they are moving they need to do so in a way that the always cover the screen as it done with the default slide left/right animation.

Drawing bitmaps with empty areas

I need to draw a bitmap on top of a completely rendered GLSurfaceView. By completely rendered I mean that the entire thing is filled with colorized triangles. Obviously the bitmap will hide the triangles underneath it, but I would like to minimize how much is hidden.
The bitmap is 64x64 pixels and has many empty areas that are translucent in the PNG file. When I draw the bitmap by making a square with two triangles, the translucent areas become black (the green areas in the picture above), perhaps because the app background is black. Is there an easy way to get the translucent areas to not affect the image (the second image above)? Do I need to create a complex set of triangles that exactly outlines the non-translucent parts when I render the bitmap?
I am developing on a Motorola Xoom, Android 3.0. Thanks for your time.
Use the alpha test.

Categories

Resources