안 드 로 이 드 화판 개발 의 취소 기능
이 편 은 반 철회 기능 의 실현 을 설명 할 것 이 며,먼저 이 원리 가 어떻게 실현 되 었 는 지 토론 할 것 이다.
매번 철회 하 는 내용 을 내용 은 어떻게 정의 합 니까?사실은 매 획,매 획 을 철회 하 는 내용 으로 한 획 한 획 을 어떻게 계산 합 니까?손가락 으로 누 르 고-이동-놓 는 과정 이 한 획 입 니 다.
우 리 는 이 과정 을 한 획 으로 기록 한 다음,그 려 진 목록 list 목록 으로 이 과정 을 기록 한 paint 붓 과 경로 path 를 사용 합 니 다.
취소 할 때 뒤의 데 이 터 를 다른 취소 목록 으로 옮 깁 니 다.
취소 할 때 취소 목록 의 맨 뒤에 있 는 데 이 터 를 그림 목록 으로 이동 합 니 다.
그 다음 에 또 하나의 중점 은 바로 붓 의 보존 수량 이다.위 에서 말 한 모든 붓 을 기록 하 는 것 이다.이것 은 당연히 한계 가 있다.수백 획 을 그 려 서 기록 할 수 없다.이런 메모리 소모 가 매우 크기 때문에 붓 의 수량 을 초과 할 때 우 리 는 앞의 그림 을 화판 에 죽 였 다.
기본 원 리 는 이렇다.이제 저 를 따라 이 루어 주세요.
실현
어떻게 철회 기능 을 실현 합 니까?
2.1 정의 데이터 클래스
우선,하나의 bean 류 가 모든 데 이 터 를 저장 해 야 합 니 다.여 기 는 PaintData 를 정의 합 니 다.그 안에 draw 방법 을 정의 해 야 합 니 다.취소 할 때 다시 그 려 야 하기 때 문 입 니 다.
data class PaintData(
var mPaint: Paint, //
var mPath: Path //
) {
/**
*
* @param canvas
*/
fun draw(canvas: Canvas){
canvas.drawPath(mPath,mPaint)
}
}
2.2 패 널 비우 기 방법 수정목록 이 많아 졌 기 때문에 화판 을 비 우 는 방법 은 목록 도 지 워 야 합 니 다.
/**
*
* @param isClearList
*/
fun clear(isClearList:Boolean) {
if(isClearList){
mRevokedList.clear()
mPaintedList.clear()
}
mBufferCanvas.drawColor(0, PorterDuff.Mode.CLEAR)
invalidate()
}
2.3 취소 방법 실현view 에서 두 개의 목록 을 정의 합 니 다.하 나 는 이미 그 려 진 내용 목록 이 고 하 나 는 내용 을 취소 하 는 목록 입 니 다.
//
private var mPaintedList: MutableList<PaintData> = ArrayList<PaintData>()
//
private var mRevokedList: MutableList<PaintData> = ArrayList<PaintData>()
고어 층 canvas 와 bitmap 를 추가 하여 기록 을 초과 한 붓 은 경화 층 에 쓰 여 죽 었 다.
// ,
private lateinit var mHoldBitmap: Bitmap
private lateinit var mHoldCanvas: Canvas
// 20
private val MAX_PAINT_RECORED = 20
// :
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
if(mBufferCanvas == null){
mBufferBitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888)
//canvas , mBufferBitmap
mBufferCanvas = Canvas(mBufferBitmap)
}
if(mHoldCanvas == null){
mHoldBitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888)
mHoldCanvas = Canvas(mHoldBitmap)
}
}
그리고 철회 하 는 방법 을 정의 합 니 다.
/**
*
* @return
*/
fun revoked(){
reDraw(mPaintedList)
}
취소 방법 은 기본적으로 일치 합 니 다.목록 만 바 꾸 었 을 뿐 입 니 다.
/**
*
*/
fun unRevoked(){
reDraw(mRevokedList)
}
그리고 다시 그 리 는 방법 은:
/**
*
* @param paintList list
*/
private fun reDraw(paintList:MutableList<PaintData>){
if(paintList.size > 0){
val paint = paintList.removeAt(paintList.size-1)
if(paintList === mPaintedList){
mRevokedList.add(paint)
}else{
mPaintedList.add(paint)
}
//
mBufferCanvas.drawColor(0, PorterDuff.Mode.CLEAR)
invalidate()
}
}
그 다음 에 붓 을 저장 하고 터치 해서 눌 렀 을 때 붓 을 저장 합 니 다.
override fun onTouchEvent(event: MotionEvent): Boolean {
when(event.action){
MotionEvent.ACTION_DOWN -> { //
//
mPath.moveTo(event.x,event.y)
// , ACTION_DOWN
preX = event.x
preY = event.y
//
mPaintedList.add(PaintData(Paint(mPaint),Path(mPath)))
}
MotionEvent.ACTION_MOVE -> { //
// , ,
mPaintedList.get(mPaintedList.size-1).mPath.quadTo(preX,preY,event.x,event.y)
// , onDraw
invalidate()
preX = event.x
preY = event.y
}
MotionEvent.ACTION_UP ->{
//
mPath.reset()
}
}
// true: ,
// false: , , imageview
return true
}
마지막 으로 그 릴 때:
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
// bitmap
while(mPaintedList.size > MAX_PAINT_RECORED){
val paintData = mPaintedList.removeAt(0)
paintData.draw(mHoldCanvas)
}
// Canvas
mBufferCanvas.drawBitmap(mHoldBitmap,0f,0f,null)
//
for(paint in mPaintedList){
// path
paint.draw(mBufferCanvas)
}
// bitmap
canvas.drawBitmap(mBufferBitmap,0f,0f,null)
}
마지막 으로 캔버스 를 지 울 때 붓 목록 도 지 워 야 합 니 다.
/**
*
*/
fun clear() {
mRevokedList.clear()
mPaintedList.clear()
mHoldCanvas.drawColor(0, PorterDuff.Mode.CLEAR)
mBufferCanvas.drawColor(0, PorterDuff.Mode.CLEAR)
invalidate()
}
중요 한 것 은 하나의 bean 류 를 이용 하여 모든 붓 과 경 로 를 저장 한 다음 취소 할 때 다시 그 리 는 것 이다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.