Android View Clipping - PullRequest
       38

Android View Clipping

54 голосов
/ 07 апреля 2011

Есть ли способ определить область клипа ViewGroup в Android (Honeycomb)?Например, у меня есть ListView с фоном изображения, который имеет закругленные углы.Когда я прокручиваю список, дети выходят за пределы фона - я бы предпочел, чтобы они обрезали скругленные углы.Left: unclipped, Right: clipped

Левое изображение - то, что оно делает в настоящее время, а правое - то, что я хотел бы.

Я смотрел на ClipDrawable, но кажется, что это можно использовать толькодля индикаторов?

Также я пытаюсь сделать это в виджете.Поэтому я не могу использовать пользовательский вид и переопределить onDraw для маскировки.

Спасибо!

Ответы [ 8 ]

24 голосов
/ 29 января 2015

Попробуйте создать подкласс 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 (), и фон будет добавлен на основе вашего «округленного» рисунка.

5 голосов
/ 27 ноября 2013

Создайте пользовательский макет с помощью overridden onDraw(Canvas canvas)

call canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);

, это обрезает все виды, которые выходят за границы макета.

И не забудьтевызовите setWillNotDraw(false) в конструкторе, поэтому ваш onDraw выполнит

4 голосов
/ 15 января 2019

Убедитесь, что layout имеет фон с закругленными углами.

Kotlin

layout.outlineProvider = ViewOutlineProvider.BACKGROUND
layout.clipToOutline = true

Java

layout.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
layout.setClipToOutline(true);
1 голос
/ 11 апреля 2012

Если вы посмотрите на WhatsUp , вы увидите, что на изображении контакта есть изображение, закругленное с помощью скругленной границы.Для этого я поместил ImageView в FrameLayout (FrameLayout, потому что я использую ProgressBar перед изображением, чтобы уведомить загрузку [фактически невидимую]), которая имеет округленную границу.Картинка имеет квадратную форму, но чтобы уточнить ее, вам нужно поработать с холстом.

Еще раз посмотрите на эту ссылку , которая решит вашу проблему;)

1 голос
/ 26 марта 2012
Path p = new Path()

// define your clipping path...

canvas.clipPath(p);
1 голос
/ 24 мая 2011

Как насчет этого: Как преобразовать представление Android в растровое изображение , затем обрезать это растровое изображение.

Или, еще одна идея, использовать FrameLayout, сложить маску клипа сверхувашей ViewGroup.У маски скрепки были бы прозрачные средние, непрозрачные границы.

В обоих случаях, я думаю, будет сложно обработать пользовательский ввод ...

0 голосов
/ 10 апреля 2012

Даешь андроид: клип для добавления попробуйте. Это решит вашу проблему.

0 голосов
/ 23 августа 2011

Может быть, вы можете использовать метод Canvas.clipRegion, чтобы обрезать различия между представлениями.

...