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 попробуйте. Это решит вашу проблему.