2013-03-28 5 views
0

나는 장치의 화면을 만질 때 볼이 나오고 움직이는 프로그램을 만들려고합니다. 나중에 MyImage 클래스의 인스턴스가 여러 개 필요할 것이므로 별도의 클래스에 이미지를 넣습니다. 화면을 터치 할 때마다 다른 볼이 나올 수 있습니다.다른 클래스의 캔버스에 객체를 그리는 방법은 무엇입니까?

이미지가 포함 된 MyImage 클래스가 있습니다. 이 클래스는 View 클래스로 확장되었습니다. override 메서드 onDraw는 이미지가 움직이는 곳입니다 (화면에서 튀는).

public class MyImage extends View { 
Bitmap g; 
float posY = 0; 
float posX = 0; 

boolean ud = true, lr = true; 

public MyImage(Context context) { 
    super(context); 
    g = BitmapFactory.decodeResource(getResources(), R.drawable.ba); 
} 
@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawColor(Color.WHITE); 
    canvas.drawBitmap(g, posX, posY, null); 

    ...... //code for animating 


    invalidate(); 
} 
} 

이 클래스의 객체를 만들어 MainActivity 클래스의 다른 캔버스에 애니메이션으로 적용하려고합니다.

public class MainActivity extends Activity implements OnTouchListener{ 
..... //declarations 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mySurfaceView = new MySurfaceView(this); 
    mySurfaceView.setOnTouchListener(this); 
    setContentView(mySurfaceView); 
} 

@Override 
protected void onPause() { 
    .... 
} 
@Override 
protected void onResume() { 
    .... 
} 

Thread myThread; 
Canvas canvas; 

public class MySurfaceView extends SurfaceView implements Runnable{ 
    SurfaceHolder myHolder; 
    boolean isRunnable = false; 

    public MySurfaceView(Context context) { 
     super(context); 
     myHolder = getHolder(); 
    } 
    public void pause(){ 
     .... 
    } 

    public void resume(){ 
     isRunnable = true; 
     myThread = new Thread(this); 
     myThread.start(); 
    } 

    @Override 
    public void run() { 
     while(isRunnable){ 
      if(!myHolder.getSurface().isValid()){ 
       continue; 
      } 
      canvas = myHolder.lockCanvas(); 
      canvas.drawRGB(100, 0, 0); 

      myHolder.unlockCanvasAndPost(canvas); 
     } 
    } 
} 

@Override 
public boolean onTouch(View v, MotionEvent me) { 
    ..... 

    switch(me.getAction()){ 
    case MotionEvent.ACTION_DOWN: 
     break; 
    case MotionEvent.ACTION_UP: 
     mi = new MyImage(this); 

     canvas.drawBitmap(..) ;//Is it possible to convert object to Bitmap? 

     break; 
    } 
    return true; 
} 
} 

문제

내가 내가 캔버스로 그릴 수 있도록 myimage을의 객체가 비트 맵으로 만들어 줘야 잘 모릅니다이다. 또한 MyImage 클래스에서 이미 캔버스를 가지고 있기 때문에 내가 한 일이 옳은지 확실하지 않습니다. 캔버스는 주요 활동의 캔버스를 덮을 것입니다. 누구든지 도움이 될 수 있습니까?

답변

2

그래, 아마도 그 접근 방식을 바꿀 것입니다. 각 공에 대한 뷰를 만드는 것은별로 의미가 없습니다. 하나의 사용자 지정보기를 만들 것입니다. 이보기에는 볼 목록이 포함될 수 있습니다. 그보기의 onDraw() 방법에서는 모든 볼을 그릴 수 있습니다. 공은 시작 부분에 기본 반경이있는 Point 또는 PointF 개체 일 수 있습니다.

private class MyView extends View { 
    List<Point> balls; 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     for(Point p : balls){ 
      canvas.drawCircle(p.x, p.y, 10, myPaint); 
     } 
    } 
} 
의 선을 따라

뭔가

관련 문제