Android Clipping Clipping
Есть ли способ определить область клипа в ViewGroup в android (Honeycomb)? Например, у меня есть ListView с фоном изображения, который имеет закругленные углы. Когда я просматриваю список, дети торчат мимо углов фона - я бы предпочел, чтобы они зажимались в закругленных углах.
![Left: unclipped, Right: clipped]()
Левое изображение - это то, что он делает в настоящее время, и право - это то, что я хотел бы.
Я смотрел на ClipDrawable, но кажется, что это можно использовать только для индикаторов выполнения?
Кроме того, я пытаюсь сделать это в виджетах. Поэтому я не могу использовать пользовательский вид и переопределять onDraw для маскировки.
Спасибо!
Ответы
Ответ 1
Попробуйте подклассифицировать 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(), и фон будет добавлен на основе вашего округленного вывода.
Ответ 2
Создайте собственный макет с помощью overridden onDraw(Canvas canvas)
вызов canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);
это закроет все виды, выходящие за пределы макета.
И не забудьте вызвать setWillNotDraw(false)
в конструкторе, поэтому ваш onDraw выполнит
Ответ 3
Как насчет этого: Как отобразить представление Android в растровое изображение, затем скопируйте это растровое изображение.
Или, еще одна идея, используйте FrameLayout
, соедините маску клипа над своей ViewGroup. Маска клипа будет иметь прозрачные средние, непрозрачные границы.
В обоих случаях, я думаю, будет сложно обрабатывать ввод пользователя...
Ответ 4
Path p = new Path()
// define your clipping path...
canvas.clipPath(p);
Ответ 5
Если вы посмотрите на WhatsUp, вы можете увидеть, что на картинке контакта изображение с округлой границей.
Для этого я поместил ImageView внутри FrameLayout (FrameLayout, потому что я использую ProgressBar перед изображением, чтобы уведомлять загрузку [фактически невидимый]), который имеет закругленную границу. Изображение имеет квадратную форму, но для его уточнения вам необходимо работать с холстом.
Взгляните на ссылку , которая решит вашу проблему;)
Ответ 6
Может быть, вы можете использовать метод Canvas.clipRegion, чтобы скопировать различия в представлениях.
Ответ 7
Убедитесь, что layout
имеет фон с закругленными углами.
layout.outlineProvider = ViewOutlineProvider.BACKGROUND
layout.clipToOutline = true
Ответ 8
Дайте андроид: clipToPadding попробуйте. Это решит вашу проблему.