개인 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;
}
이 문제는 어렵지 않습니다. 작업판 A의 그리기를 트리거할 때 A점의 좌표를 반전시켜야 합니다. 변환 관계에 따라 B점의 좌표를 계산하고 B에 점을 그립니다. https://segmentfault.com/n/1330000005040693
@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"
</RelativeLayout>
Websocket을 구현할 수 있지만 IE에서는 플래시를 사용해야 합니다