찾다

 >  Q&A  >  본문

android - 求问:2个画板A和B,在A上画的动作如何每时每刻在B上也自动画出?

两个画板A和B,我在A画板上画画,然后在B上一步一步全部自动重绘出来,要有重绘过程。

天蓬老师天蓬老师2773일 전706

모든 응답(2)나는 대답할 것이다

  • 迷茫

    迷茫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;
    /**

    <리>

    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;

    /**

    <리>

    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>

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-17 16:53:30

    Websocket을 구현할 수 있지만 IE에서는 플래시를 사용해야 합니다

    회신하다
    0
  • 취소회신하다