2011-11-02 2 views
0

내 Android 앱에는 현재 배경색 및 onCreate가있는 RelativeLayout이라는 하나의 액티비티가 있으며 다음과 같이 addViews를 장치 화면 너비와 높이를 기준으로 한 상대적 지연. 다음은 코드 스 니펫입니다.Canvas에 그려진 원을 드래그하여 화면 (앤드 로이드)에서 사용자 끌기를 수행합니다.

MyActivity.java 

package com.myapp.android; 

import java.util.Random; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Display; 
import android.widget.RelativeLayout; 

public class MyActivity extends Activity { 
    /** Called when the activity is first created. */ 
    Random randomGenerator = new Random(); 
    String[] colors = { "#84B62C", "#6A28F2","#F3FA0A", "#DF1FE4", "#0000A0", "#28C9DB", "#E05323"}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     RelativeLayout main = (RelativeLayout) findViewById(R.id.main_myapp); 
     // Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

     Display display = getWindowManager().getDefaultDisplay(); 
     int width = display.getWidth(); 
     int height = display.getHeight(); 

     int number_side = width/100; 
     int number_down = height/100; 
     for(int i = 0; i < (number_side * number_down) * 3; i++) { 
       main.addView(new Ball(this,randomGenerator.nextInt(width), randomGenerator.nextInt(height), 40 * (randomGenerator.nextInt(3)), colors[randomGenerator.nextInt(colors.length)], "BALL" + Integer.toString(i))); 
     } 
    } 
} 

이렇게하면 원하는 모든 화면의 모든 색상환을 무작위로 그립니다. 좋아 보인다. 다음은 Circle이 그려지는 Ball.java 코드입니다.

Ball.java 

package com.myapp.android; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.RelativeLayout; 

public class Ball extends View { 

    private final float x; 
    private final float y; 
    private final int r; 
    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 

    public Ball(Context context, float x, float y, int r, String color, String tag) { 
     super(context); 
     mPaint.setColor(Color.parseColor(color)); 
     this.x = x; 
     this.y = y; 
     this.r = r; 
     this.setTag(tag); 
} 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawCircle(x, y, r, mPaint); 
    } 

} 

는 내가 뭘하려고 사용자가 색칠 된 원 중 하나를 만지게하고 그들이 원하는하지만 난 그들이 이동하는 얻을 수없는 곳마다 화면에 드래그합니다. 여기에 평가판 코드를 게시하지 않았습니다.

화면에 그려진 서클 (한 번에 한 서클 씩, 특히 사용자가 터치 한 서클)에서 사용자 터치 (onTouch 또는 onLongClick 일 수 있음)를 감지하는 가장 좋은 방법은 무엇입니까? 사용자가 드래그 동작 (ACTION_UP - 내 추측)을 해제 할 때까지 드래그 액션 (ACTION_MOVE - 내 추측)을 따라갈 수있는 원 (기본적으로 런타임에 주요 상대 레이아웃 그룹에 추가 된 뷰)입니다.

이 주제에 대한 자습서를 읽었지 만 실제로 사용 사례에 도움이되지 않았거나 적용되지 못했습니다. 또한 2D 그래픽 캔버스 또는 OpenGL API를 제 경우에 사용하여 지식이있는 사람들에게 물어보고 싶었 기 때문에 서클의 드래그 작업이 매우 부드럽고 즉각적이었습니다. 내 간단한 코드를 자유롭게 실행하면 볼이 화면에 그려 질 때까지 잘 작동합니다.

답변

0

구현시 볼을 볼로 간주하므로 많은 볼이 있으므로 많은 뷰가 있습니다.

내가 너라면, 전체 화면이 하나의보기이고 공이 해당보기 안에있는 스프라이트 일 뿐이라고 생각할 것입니다.

말하자면 View 클래스 또는 SurfaceView 클래스를 확장하고 모든 좌표 및 크기의 볼을 저장할 Collection as 특성을 갖습니다. onDraw() 내부에서 콜렉션을 반복하고 볼을 정확한 위치에 올바른 크기로 그려야합니다.

관련 문제