Android Clipping Clipping

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

Левое изображение – это то, что он сейчас делает, и это то, что мне хотелось бы.

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

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

Спасибо!

Solutions Collecting From Web of "Android Clipping Clipping"

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

Создайте собственный макет с overridden onDraw(Canvas canvas)

Вызов canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);

Это закроет все виды, выходящие за пределы макета.

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

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

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

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

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

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

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

 Path p = new Path() // define your clipping path... canvas.clipPath(p); 

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