I'm trying to use a 9 patch image on a button in Android. I have it in the drawable-nodpi folder so it should use the same image for any resolution and not stretch it. If that's the case I'm totally mystified as to why this would happen:
Looks fine in the GUI in Eclipse
But in the simulator...
It seems to be stretching the image even though its in the drawable-nodpi, any idea why this is happening?
This is my image
If you look closely at the bottom of your image, it looks as if there is some drop shadow in the same line as the bottom 9-patch black line.
This will cause your 9-patch not to work.
Did you create the 9 patch in Android's 9 patch creator? This will make sure such things will not happen
Related
Dear Fellow Developers,
I've ran into the problem shown in the attached picture. We have been trying to tweak the dropdown menu's 9patch image provided by a graphics designer, but could not get it to work. The black stretch markers are not being hidden, and Android does not stretch it the way we would expect.
The device is a Nexus 7. We have tried several various image sizes, but none seemed to work. I am also attaching a copy of the 9patch.
What could be wrong?!
This happens:
Here is the 9patch
If the image has been created in a normal image editor rather than the android 9 patch tool, it could be just that its not done exactly right.
The image must have a 1px transparent border other than where the black lines are. Make sure its completely transparent and is only 1 px thick
Also I don't think you can have split lines (like you have down the left and right side of the image, I think they must be one solid line on each side)
I've made this 9-patch png and added it to the res/drawable folder:
It works nice in the example eclipse shows:
But on the emulator it looks messed up:
Why is this happening and how can I fix this?
EDIT: The border on which I've placed the black dots is white, not transparent. Not sure if that's got anything to do with it...
This probably happens because you have a small mistake with the black pixels you have set.
Try to re-cut the edges of the picture and to add the black pixels all over again.
I had this problem too once and this helped me.
if the border is white then this is your problem it has to be pure black or nothing at all.
UPDATE: Try this image:
It seems you are not saved your image with .9.png
In order to make it work do like this
save your image in the following format in your drawable folder
yourimage.9.png (not png format of your image)
Check this reference draw 9 patch
The Android SDK contains a 9-patch editing tool (draw9patch.bat) that can help you to produce and/or validate 9-patch images. Without it, it is very easy to make a mistake in defining your border.
The one-pixel border should be transparent except for the black pixels that define the various parts of the image to be treated differently during scaling.
I'm testing on HTC Desire which is a hdpi device. The problem is clear when you look at the image:
And here is how my 9-patch (made with standard 9-patch tool) looks (zoomed):
The left image is my photoshop file, and the right one is a screenshot from my device. As you can see there is a huge difference. Let's say that the shadow is not THAT important, but the blurred border looks bad.
Is my 9-patch png wrong? What can I do to achieve a nice crisp 1px solid border?
You should use 9-path tool for each png in different drawable folder. Sometimes problem is this the Android try to convert the png and blur the black lines, what cause later problem with properly displaying.
To circumvent this problem simply drop the 9 patch inside the drawable-no-dpi folder.
This allows to have one image for all densities. And android won't touch the image.
This is mostly what I do for my projects, unless I really want to have a difference between the densities. In that case, I create one 9-patch per density.
Alternate solution:
Shrink your top and left markers by 1 pixel on each side. This will ensure that scalable part does not overlap the grey border.
I need express help with 9 patch. I run draw9patch and change and save as name.9.png and save at res/drawable ( later tried in res/drawable-hdpi but didn't help) but problem is when I show on devic/emilator it doesn't strech and that black pixels at border are still visible ( I thought it is visible only inside 9patch for creating intersection ). Can somebody told me what is wrong ? I saved as name.9.png but it seems like it not recognize like 9.patch
Ensure transparency is not set in the outer pixel border that sets the patches. The Draw9Patch tool accepts it so it looks correct but it never actually works in my experience.
Ensure your 9patch image is named like this: imageName.9.png
Hello,
see above for my 9 patch image. It is created using the 9 patch editor from Android tools. I have multiple issues:
The nine patch tool in preview scales the image in height as well. Why? Zhere is no black line on the left.
The nine patch tool shows bad patches. I think that means that I still can use it but it might not look good. Is there any simpler shape than this? What goes wrong when stretching?
I cannot import this 9.png file into my project without errors. So technically there must be something wrong.
Thanks, A.
Seems like both top and left lines are required by 9-patch to determine the stretchable area. You could put one pixel there. You could later fix the height of the view which uses this image to prevent it from stretching in height.
You need to add stretch information for height too. A nine patch should be stretchable both horizontal and vertically.
The bad patches are warning of artifacts may be produced when stretching.
Try deleting stretch above the green/white transition of your image.
I think the missing vertical stretch is why you get error, assuming it is has the extension 9.png.
Tips for enhancing you nine patch:
By the looks of your image you have included the right border as stretchable too, you might want to remove that.
Consider only having 3 pixels stretch above the green content, then 1px above the white content to keep the aspect ratio. There is no need to stretch the whole image. You need only 1px transparent padding from image to stretch data.