2016-06-14 1 views
0

Canvas를 사용하여 비트 맵을 그리는 데이 사이트의 일부 코드를 사용하여 휴대 전화에서 테스트 한 결과 엄청나게 느린 것처럼 보였습니다. 빠르게 그렸을 경우 전체를 등록하지 않은 것 같은 느낌이었습니다 운동뿐만 아니라 그것의 일부. 또한 주요 활동 클래스가 아닌 클래스 내부의 메서드에 단추를 바인딩하려고합니다. 어떻게해야합니까? 코드 : MainActiviy.java (라고 MySecondDrawingSpace.java)Canvas 성능 문제

public class MySecondDrawingSpace extends Activity 
    { 
    DrawView myDrawView; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     // myDrawView = new MyDrawView(this, null); 
     setContentView(R.layout.activity_my_second_drawing_space); 
     myDrawView = (DrawView)findViewById(R.id.draw); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 



     getMenuInflater().inflate(R.menu.menu_my_second_drawing_space, menu); 
     return true; 
    } 
} 

xml 파일

<?xml version="1.0" encoding="utf-8"?> 
<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" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MySecondDrawingSpace" 
    android:background="@drawable/kariert"> 
    <com.drawingspace.dakson.myseconddrawingspace.DrawView 
     android:id ="@+id/draw" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Clear" 
     android:onClick="clear" 
     android:id="@+id/button" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" /> 

    <Button 
     android:id ="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="save" 
     android:layout_alignParentBottom="true" 
     /> 



</RelativeLayout> 

보기 클래스

다음 다음
public class DrawView extends View { 
    public Bitmap mBitmap; 
    public Canvas mCanvas; 
    private Path mPath; 
    private Paint mBitmapPaint; 
    private Paint mPaint; 


    public DrawView(Context c, AttributeSet attrs) { 
     super(c, attrs); 

     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(0xFF000000); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(9); 

    } 


    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 

     canvas.drawPath(mPath, mPaint); 


    } 

    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 4; 

    private void touch_start(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 
    private void touch_move(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; 
     } 
    } 
    private void touch_up() { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       touch_start(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       touch_move(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_UP: 
       touch_up(); 
       invalidate(); 
       break; 
     } 
     return true; 
    } 
    public void clear(){ 
     mBitmap.eraseColor(Color.GREEN); 
     invalidate(); 
     System.gc(); 

    } 

} 

답변

0

터치 이벤트가 빨리 갈 경우, onDraw, 당신은 새로운 지점을 가질 때마다 그릴 필요가 없습니다, 실제로 그걸 물어볼 때 그려야합니다 - 안으로 onDraw met 벽돌 상자. 하지만, skia (안드로이드 캔버스 기반)는 그렇게 많은 쿼드를 그리기에는 너무 빠르지 않습니다. 간단한 선 배치를 그릴 수 있지만,이 선들은 Centripethal Catmull-Rom 스플라인 또는 일부 스플라인으로 형성하십시오.

그리고 더 Path

+0

내가 무효화를 호출 할 때마다 호출 된 onDraw의 방법은 아닙니다 순전히 라인을 저장할 수 있습니다()? 그럼 화면을 터치 할 때 항상 무효화를해야하기 때문에 어떻게 바꿀 수 있습니까? 내 모든 그려진 '경로'가 기본적으로 배열로 저장되고 너무 커지는 것을 의미합니까? 답변 해 주셔서 감사합니다. btw –