2011-04-06 53 views
46

有沒有什麼辦法可以在android(Honeycomb)中定義ViewGroup的片段區域?例如,我有一個帶圓角的圖像背景的ListView。當我滾動列表時,孩子們伸出背景的角落 - 我更喜歡他們在圓角內剪輯。 Left: unclipped, Right: clippedAndroid View Clipping

左圖是它現在正在做的,右圖是我想要的。

我在看ClipDrawable,但它似乎只能用於進度條?

此外,我試圖在一個小部件中做到這一點。所以我不能使用自定義視圖並重寫onDraw進行遮罩。

謝謝!

+1

你有解決方案嗎?你能告訴嗎? – 2015-06-23 15:20:17

回答

1

這個怎麼樣:How to render an Android view to a bitmap,然後剪下那個位圖。

或者,另一種想法是,使用FrameLayout,將您的剪輯遮罩堆疊在您的ViewGroup頂部。剪貼蒙版將具有透明的中間不透明邊框。

在這兩種情況下,我想這將是棘手的處理用戶輸入...

+0

第一個選項不起作用,因爲它在一個小部件中,因此它只能使用RemoteViews兼容的Views。 – 2011-05-28 03:55:46

+0

而對於第二種選擇,由於它是主屏幕小部件,因此剪貼蒙版將不可行。 – 2011-05-28 03:57:25

0

可能是你可以使用的方法Canvas.clipRegion夾的,以意見分歧。

0
Path p = new Path() 

// define your clipping path... 

canvas.clipPath(p); 
-1

給android:clipToPadding一試。它會解決你的問題。

1

如果你看看WhatsUp你可以看到,在聯繫人圖片中有一個圓形的邊框圖像。 要做到這一點,我已經把ImageView的一個FrameLayout裏內(FrameLayout裏,因爲我使用的進度在圖片前面裝載通知[實際上無形])已圓角邊框。圖片呈方形,但要細化它,您需要使用畫布。

再看一下這個link,將解決你的問題。)

5

overridden onDraw(Canvas canvas)

呼叫canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);

創建自定義佈局,這將剪輯熄滅佈局邊界的所有意見。

而且不要忘記調用setWillNotDraw(false)在構造函數,所以你的onDraw將執行

16

嘗試的ViewGroup子類和重寫OnDraw的方法如下,在值RADIUS_IN_PIXELS代:

@Override 
protected void onDraw(Canvas canvas) { 
    Path clipPath = new Path(); 
    clipPath.addRoundRect(new RectF(canvas.getClipBounds()), RADIUS_IN_PIXELS, RADIUS_IN_PIXELS, Path.Direction.CW); 
    canvas.clipPath(clipPath); 
    super.onDraw(canvas); 
} 

.. 。並且還創建一個自定義繪製這樣叫類似「圓角」,在YOUR_BACKGROUND_COLOR和RADIUS_IN_DP代,確保在DP的矩形圓角匹配到以前的裁剪半徑PX:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <corners android:radius="RADIUS_IN_DP" /> 
    <solid android:color="YOUR_BACKGROUND_COLOR"/> 
</shape> 

然後你就可以使用該子類在你的佈局,增加線路

android:background="@drawable/rounded" 
android:clipChildren="true" 

所有的孩子會夾到您在的OnDraw()重寫指定邊界和背景會根據你的「四捨五入」繪製添加。

+0

非常感謝您的回答...它的作用像魅力....! – Kushal 2017-02-24 08:51:38