Перетащите круг, нарисованный на холсте, чтобы следовать за движением пользователя по экрану (Android) - PullRequest
0 голосов
/ 02 ноября 2011

В моем приложении для Android на данный момент есть одно действие: RelativeLayout с фоновым цветом и onCreate. Я создаю несколько случайных цветных кругов и добавляю ViewView в относительный макет на основе ширины и высоты экрана устройства. Вот фрагменты кода.

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)));
        }
    }
}

Это прекрасно работает, рисует все цветные круги случайным образом по всему экрану, как я хочу. Выглядит хорошо. Вот код для 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) на любом из окружностей, нарисованных на экране (один кружок за раз, особенно тот, к которому прикоснулся пользователь), и после этого сделать обведите в кружок (который по сути является видом, добавленным в основную группу Relative Layout View во время выполнения), чтобы следить за действием перетаскивания пользователем (ACTION_MOVE - мое предположение), пока они не отпустят перетаскивание (ACTION_UP - мое предположение).

Я прочитал несколько учебных пособий по этой теме, но ни один из них не был действительно полезным или применимым к моему случаю использования. Также я хотел бы попросить вас, ребята, знающие, использовать ли в моем случае 2D Graphics Canvas или OpenGL API, чтобы операция перетаскивания по кругу была очень плавной и мгновенной. Не стесняйтесь запускать мой простой код, он прекрасно работает, пока шары не нарисованы на экране.

1 Ответ

0 голосов
/ 05 декабря 2014

В вашей реализации вы рассматриваете Ball как View, и есть много шаров, таким образом, есть много видов.

На вашем месте я буду считать, что весь экран - ОДИН вид, а шары - только спрайты внутри этого вида.

Скажем, я расширю класс View или класс SurfaceView и получу атрибут Collection как атрибут для хранения всех координат и размеров шариков. Внутри onDraw () он должен перебрать коллекцию и нарисовать шары в правильном месте с правильным размером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...