반응형
- 단색이 아닌 특정 이미지를 활용하여 View의 테두리를 붙여서 그려줘야 하는 경우가 있었다.
- 이미 그려야하는 라인의 각 지점에 대한 좌표 값들이 프로젝트에 구성되어 있었기 때문에 그에 따라 비트맵을 붙여주기만 하면 되었다.
val measure = PathMeasure(path, false)
val length = measure.length
- PathMeasure(path, forceClosed: Boolean)는 Android에서 Path의 길이와 경로 상의 점, 방향 등을 측정할 수 있게 해주는 클래스다. 이를 통해 그려야 하는 라인 상의 정확한 위치와 방향을 찾을 수 있다.
- 그리기 전에 경로 길이를 측정해놓고, 이후 일정 거리마다 지점에 비트맵을 붙일 것이다.
- forceClosed: Boolean의 경우에는 path 구성할 때, path.close() 했다면 false 아니라면 true로 설정해 주면 된다.
- 내가 직접 path의 마무리를 지었는지, 아니면 시스템이 자동으로 마지막 연결지점과 첫번째 연결지점을 연결해서 마무리하게 만들 것인지를 결정할 수 있다.
val rawBitmap = BitmapFactory.decodeResource(resources, drawableRes)
val size = strokeWidth.toInt()
val patternBitmap = rawBitmap.scale(size, size)
- 라인에 넣을 리소스와 그 사이즈를 지정해준다.
val pos = FloatArray(2)
val tan = FloatArray(2)
var distance = 0f
while (distance < length) {
measure.getPosTan(distance, pos, tan)
val x = pos[0] - patternBitmap.width / 2f
val y = pos[1] - patternBitmap.height / 2f
canvas.drawBitmap(patternBitmap, x, y, null)
distance += patternBitmap.width + 2f
}
- 이제 경로를 따라 이미지를 반복적 배치한다.
measure.getPosTan(distance, pos, tan)
- distance만큼 떨어진 경로 위의 점 위치(pos)와 방향벡터(tan)를 구하는 함수다.
- 계산된 좌표에서 가운데 중심으로 비트맵을 붙여준다.
- 위 개념들을 활용해 보면 곡선이나 도형 모양으로 아래처럼 이미지 기반 라인을 그릴 수 있다.
반응형