programing

안드로이드 뷰 클리핑

subpage 2023. 10. 16. 21:50
반응형

안드로이드 뷰 클리핑

안드로이드(Honeycomb)에서 ViewGroup의 클립 영역을 정의할 수 있는 방법이 있습니까?예를 들어 모서리가 둥근 이미지 배경의 ListView가 있습니다.목록을 스크롤하면 아이들이 배경 구석을 지나 튀어나와요. 저는 아이들이 둥근 모서리 안에서 잘라내기를 원합니다.Left: unclipped, Right: clipped

왼쪽 이미지는 현재 하고 있는 것이고 오른쪽은 제가 하고 싶은 것입니다.

ClipDrawable을 보고 있었는데 프로그레스 바에만 사용할 수 있는 것 같습니까?

그리고 위젯으로 하려고 합니다.그래서 마스킹을 위해 Custom View를 사용하고 Draw를 재정의할 수 없습니다.

감사해요!

꼭!layout배경에 둥근 모서리가 있습니다.

코틀린

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

자바

layout.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
layout.setClipToOutline(true);

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, 클립 마스크를 ViewGroup(보기 그룹) 위에 쌓습니다.클립 마스크에는 투명한 가운데 불투명 테두리가 있습니다.

두 경우 모두 사용자 입력을 처리하는 것이 까다로울 것으로 생각됩니다.

Path p = new Path()

// define your clipping path...

canvas.clipPath(p);

WhatsUp을 보면 연락처 사진에 둥근 테두리로 둥근 이미지가 있음을 알 수 있습니다.이를 위해 테두리가 둥근 프레임 레이아웃(그림 앞의 ProgressBar를 사용하여 [사실 보이지 않는] 로딩을 통지하므로 프레임 레이아웃) 안에 이미지 뷰를 넣었습니다.그림은 네모난 모양이지만 다듬기 위해서는 캔버스로 작업해야 합니다.

문제를 해결할 수 있는 이 링크를 한 번 더 확인해 보십시오;)

정의 @Marco 에서를 View.outlineProvider 제품인 구글 의했습니다를 했습니다.MaterialCardView 어떤 이유에서인지, 그 그림은 아이들에게 둥근 모서리를 씌우지 않습니다.자식 뷰는 둥근 모서리 위에 그려질 것입니다.

코틀린:

val cornerRadius = 16.dp()
materialCardView.apply {
    clipToOutline = true
    outlineProvider = object : ViewOutlineProvider() {
        override fun getOutline(view: View?, outline: Outline?) {
            view?.apply {
                outline?.setRoundRect(0, 0, width, (height + cornerRadius).toInt(), cornerRadius)
            }
        }
    }
}

enter image description here

Canvas.clipRegion 메서드를 사용하여 토뷰의 차이점을 자를 수 있습니다.

Android:clipToPadding을 시도해 보십시오.그것이 당신의 문제를 해결해 줄 것입니다.

언급URL : https://stackoverflow.com/questions/5574212/android-view-clipping

반응형