2014-06-10 38 views
1

我想製作一個這樣的按鈕,但我無法使用 因爲當我將它轉換爲9patch時,按鈕線條會縮放。但我要重複而豐滿,線條
按鈕,這是原始圖像 this is the original image如何爲此按鈕製作9patch按鈕


我想是這樣的 i want to be like this


但它看起來是這樣的:( But it looks like this :(

+0

使用ShapeDrawable,建立一個返回BitmapShader一個ShaderFactory – pskink

回答

1

創建位圖資源並重復紋理。

<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/ab_texture_tile_apptheme" 
    android:tileMode="repeat" /> 
+0

當我這樣做時,線條填充整個圖像不僅僅是圖像的紅色部分 – Person

+0

這是因爲你的圓角。我認爲你必須在編碼方面做一些事情。通過重複紋理創建位圖,然後在java中圍繞圖像的角落。 –

+0

@Person你可以在這裏找到四捨五入的代碼http://stackoverflow.com/a/3292810/1770916 –

1

當您縮放其中一部分時,您只使用9patch。根據您的示例圖像,您引用lines of button is scaling,這是因爲9patch。

解決方案

不使用9patch設置它爲背景繪製對象/ ImageSource的在你的願望視圖

+0

謝謝@Rod_Algonquin。有沒有其他解決方案來做到這一點。我可以用drawable xml來做到嗎? – Person

+0

@Person只是將它直接設置爲一個視圖,所以它會平等擴展。如果那些行不在那裏,你可以做一個9patch –

1

試試這個:

final float r = 32; 
float[] outerRadii = { 
     r, r, r, r, r, r, r, r 
}; 
ShapeDrawable d = new ShapeDrawable(new RoundRectShape(outerRadii, null, null)); 
ShaderFactory factory = new ShaderFactory() { 
    @Override 
    public Shader resize(int width, int height) { 
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
     Shader shader = new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT); 
     Matrix localM = new Matrix(); 
     localM.postRotate(45); 
     shader.setLocalMatrix(localM); 
     return shader; 
    } 
}; 
d.setShaderFactory(factory); 

someView.setBackgroundDrawable(d);