我同意你的問題的意見:方案陰影效果的影響是一個不錯的選擇,你可以實現一個簡單的9patch(或一組人)相同的效果就像說here。
順便說一句,我太好奇了,下班後我就結束了黑客解決方案。
給出的代碼是一個測試,並應旨在作爲一個簡單證明了概念(所以請不要downvote)。有些所示的操作是相當昂貴,並可能在表演嚴重影響(有很多例子身邊,看here,here得到一個想法)。它應該是最後的手段解決方案只適用於一次顯示的組件。
public class BalloonView extends TextView {
protected NinePatchDrawable bg;
protected Paint paint;
protected Rect padding = new Rect();
protected Bitmap bmp;
public BalloonView(Context context) {
super(context);
init();
}
public BalloonView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public BalloonView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
@SuppressLint("NewApi")
protected void init() {
// decode the 9patch drawable
bg = (NinePatchDrawable) getResources().getDrawable(R.drawable.balloon);
// get paddings from the 9patch and apply them to the View
bg.getPadding(padding);
setPadding(padding.left, padding.top, padding.right, padding.bottom);
// prepare the Paint to use below
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.rgb(255,255,255));
paint.setStyle(Style.FILL);
// this check is needed in order to get this code
// working if target SDK>=11
if(Build.VERSION.SDK_INT >= 11)
setLayerType(View.LAYER_TYPE_SOFTWARE, paint);
// set the shadowLayer
paint.setShadowLayer(
padding.left * .2f, // radius
0f, // blurX
padding.left * .1f, // blurY
Color.argb(128, 0, 0, 0) // shadow color
);
}
@Override
protected void onDraw(Canvas canvas) {
int w = getMeasuredWidth();
int h = getMeasuredHeight();
// set 9patch bounds according to view measurement
// NOTE: if not set, the drawable will not be drawn
bg.setBounds(0, 0, w, h);
// this code looks expensive: let's do once
if(bmp == null) {
// it seems like shadowLayer doesn't take into account
// alpha channel in ARGB_8888 sources...
bmp = Bitmap.createBitmap(w, h, Config.ARGB_8888);
// draw the given 9patch on the brand new bitmap
Canvas tmp = new Canvas(bmp);
bg.draw(tmp);
// extract only the alpha channel
bmp = bmp.extractAlpha();
}
// this "alpha mask" has the same shape of the starting 9patch,
// but filled in white and **with the dropshadow**!!!!
canvas.drawBitmap(bmp, 0, 0, paint);
// let's paint the 9patch over...
bg.draw(canvas);
super.onDraw(canvas);
}
}
首先,爲了得到綱領性陰影,你必須處理Paint.setShadowLayer(...)
喜歡說here。基本上你應該定義一個陰影層對於Paint
對象用於繪製您的自定義視圖的Canvas
。不幸的是,你不能使用Paint
對象來繪製一個NinePatchDrawable,所以你需要將它轉換成一個Bitmap(1st hack)。此外,看起來陰影圖層無法在ARGB_8888圖像中正常工作,所以爲了獲得適當的陰影,我發現的唯一方法是繪製給定的NinePatchDrawable(第2個黑客)的alpha蒙版,它位於其下方。
這裏有一對夫婦sshots的(在Android [email protected]和[email protected]測試)
編輯:只是要徹底,我連着在測試中使用的9patch (放置在res/drawable/mdpi
)
我想你可以繪製一個黑色矩形具有視圖的大小,然後在它上面畫出你的看法,但翻譯一點點的向下和向右(或者向下和向左,不管你想要什麼)。 – 2013-02-18 07:10:10
請你詳細說明一下如何做到這一點? – JackMahoney 2013-02-19 04:07:58
'這是一個例子。我無法使用9貼片「 爲什麼不能?這是最好和最簡單的方法。 – JanithaR 2013-02-20 04:34:27