两个画板A和B,我在A画板上画画,然后在B上一步一步全部自动重绘出来,要有重绘过程。
迷茫2017-04-17 16:53:30
이 문제는 어렵지 않습니다. 작업판 A의 그리기를 트리거할 때 A점의 좌표를 반전시켜야 합니다. 변환 관계에 따라 B점의 좌표를 계산하고 B에 점을 그립니다. https://segmentfault.com/n/1330000005040693
메인액티비티
패키지 com.cyrus.demoboard;
android.app.Activity 가져오기;
import android.os.Bundle;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import com.cyrus.demoboard.BoardView.OnPositionListener;
/**
<리>@author CyrusCao
*
*/
클래스 MainActivity는 활동을 확장합니다. {
<프리><코드> 개인 BoardView aView; 개인 BoardViewB bView; 개인 int wa,hA; 비공개 int wB,hB; 개인 부동 소수점 sX = 0.0f; 개인 부동 소수점 sY = 0.0f; @보수 protected void onCreate(Bundle saveInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); aView = (BoardView)findViewById(R.id.a_boardview); bView = (BoardViewB)findViewById(R.id.b_boardview); aView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @보수 공개 무효 onGlobalLayout() { // TODO 자동 생성된 메서드 스텁 hA = aView.getHeight(); wA = aView.getWidth(); } }); bView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @보수 공개 무효 onGlobalLayout() { // TODO 자동 생성된 메서드 스텁 hB = bView.getHeight(); wB = bView.getWidth(); } }); aView.setOnPositionListener(new OnPositionListener() { @보수 공개 무효 onPositionListener(float x,float y,int action) { // TODO 자동 생성된 메서드 스텁 if (sX == 0 || sY == 0) { sX = (wB*1.0f)/wA; sY = (hB*1.0f)/hA; } bView.triggerDraw(x*sX,y*sY,action); } }); }}
보드 A
com.cyrus.demoboard;
android.annotation.SuppressLint;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.graphics.Path;
android.util.AttributeSet;
android.view.MotionEvent;
android.view.View;
/**
@author CyrusCao
*
*/
BoardView 클래스는 View를 확장합니다. {
<프리><코드> 개인 부동 소수점 mX, mY; 개인 경로 mPath; 개인 정적 최종 부동 소수점 TOUCH_TOLERANCE = 4; 개인 페인트 mPaint; 개인 OnPositionListener mPositionListener; @SuppressLint("NewApi") 공개 BoardView(컨텍스트 컨텍스트, AttributeSet 속성, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); // TODO 자동 생성 생성자 스텁 초기화페인트(); } public BoardView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // TODO 자동 생성 생성자 스텁 초기화페인트(); } 공개 BoardView(컨텍스트 컨텍스트, AttributeSet 속성) { super(컨텍스트, 속성); // TODO 자동 생성 생성자 스텁 초기화페인트(); } 공개 BoardView(컨텍스트 컨텍스트) { 슈퍼(컨텍스트); // TODO 자동 생성 생성자 스텁 초기화페인트(); } 공공 무효 initPaint(){ mPaint = 새로운 페인트(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(0xFF00FF00); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(10); } @SuppressLint("ClickableView접근성") @보수 공개 부울 onTouchEvent(MotionEvent 이벤트) { // TODO 자동 생성된 메서드 스텁 float x = event.getX(); float y = event.getY(); if (mPositionListener != null) { mPositionListener.onPositionListener(x, y,event.getAction()); } 스위치(event.getAction()) { 사례 MotionEvent.ACTION_DOWN: mPath = 새로운 경로(); touchStart(x, y); 부서지다; 사례 MotionEvent.ACTION_MOVE: touchMove(x, y); 부서지다; 사례 MotionEvent.ACTION_UP: 터치업(); 부서지다; } 무효화(); 사실을 반환; } @보수 protected void onDraw(캔버스 캔버스) { // TODO 자동 생성된 메서드 스텁 if (mPath != null) { canvas.drawPath(mPath, mPaint); } } 개인 무효 touchStart(float x, float y) { mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; } 개인 무효 touchMove(float x, float y) { float dx = Math.abs(x - mX); float dy = Math.abs(y - mY); if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); mX = x; mY = y; } } 개인 무효 touchUp() { mPath.lineTo(mX, mY); mPath = null; } 공공 무효 setOnPositionListener(OnPositionListener mPositionListener) { this.mPositionListener = mPositionListener; } 공개 인터페이스 OnPositionListener { void onPositionListener(float x, float y, int action); }}
보드 B
com.cyrus.demoboard;
android.annotation.SuppressLint;
android.content.Context;
android.graphics.Canvas;
android.graphics.Paint;
android.graphics.Path;
android.util.AttributeSet;
android.view.MotionEvent;
android.view.View;
/**
@author CyrusCao
*
*/
BoardViewB 클래스는 View를 확장합니다. {
<프리><코드> 개인 부동 소수점 mX, mY; 개인 경로 mPath; 개인 정적 최종 부동 소수점 TOUCH_TOLERANCE = 4; 개인 페인트 mPaint; @SuppressLint("NewApi") 공개 BoardViewB(컨텍스트 컨텍스트, AttributeSet 속성, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); // TODO 자동 생성 생성자 스텁 초기화페인트(); } public BoardViewB(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // TODO 자동 생성 생성자 스텁 초기화페인트(); } 공개 BoardViewB(컨텍스트 컨텍스트, AttributeSet 속성) { super(컨텍스트, 속성); // TODO 자동 생성 생성자 스텁 초기화페인트(); } 공개 BoardViewB(컨텍스트 컨텍스트) { 슈퍼(컨텍스트); // TODO 자동 생성 생성자 스텁 초기화페인트(); } 공공 무효 initPaint() { mPaint = 새로운 페인트(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(0xFFFF0000); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(10); } 공개 무효 TriggerDraw(float x, float y, int action) { 스위치(동작) { 사례 MotionEvent.ACTION_DOWN: mPath = 새로운 경로(); touchStart(x, y); 부서지다; 사례 MotionEvent.ACTION_MOVE: touchMove(x, y); 부서지다; 사례 MotionEvent.ACTION_UP: 터치업(); 부서지다; } 무효화(); } @보수 protected void onDraw(캔버스 캔버스) { // TODO 자동 생성된 메서드 스텁 if (mPath != null) { canvas.drawPath(mPath, mPaint); } } 개인 무효 touchStart(float x, float y) { mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; } 개인 무효 touchMove(float x, float y) { float dx = Math.abs(x - mX); float dy = Math.abs(y - mY); if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2); mX = x; mY = y; } } 개인 무효 touchUp() { mPath.lineTo(mX, mY); mPath = null; }}
<리><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<코드> xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <com.cyrus.demoboard.BoardViewB android:id="@+id/b_boardview" android:layout_width="300dp" android:layout_height="250dp" android:Background="#fff000" /> <com.cyrus.demoboard.BoardView android:id="@+id/a_boardview" android:layout_width="200dp" android:layout_height="200dp" android:layout_alignParentBottom="true" android:Background="#fff000" />
</RelativeLayout>