拖动画布上绘制的圆圈跟随用户在屏幕上拖动(android)

时间:2011-11-02 18:25:45

标签: android graphics opengl-es

我现在在我的Android应用程序中有一个活动,它是一个具有背景颜色和onCreate的RelativeLayout我创建了一些随机彩色圆圈,并根据设备屏幕宽度和高度将相应的视图添加到relativelayout。以下是代码段。

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)的最佳方法是什么(一次一个圆圈,尤其是用户触摸的圆圈),然后进行circle(实际上是在运行时添加到主相对布局视图组的视图)跟随用户触摸拖动操作(ACTION_MOVE - 我的猜测),直到他们释放拖动(ACTION_UP - 我的猜测)。

我已经阅读了一些关于这个主题的教程,但没有一个真正有用或适用于我的用例。另外我想问一下知识渊博的家伙我应该在我的情况下使用2D图形画布或OpenGL API,以便圆圈上的拖动操作非常流畅和即时。随意运行我的简单代码,它可以正常工作,直到在屏幕上绘制球。

1 个答案:

答案 0 :(得分:0)

在您的实现中,您将Ball视为一个视图,并且有许多球,因此有很多视图。

如果我是你,我会认为整个屏幕是一个视图,并且球只是该视图中的精灵。

说,我将扩展View类或SurfaceView类,并使用Collection as属性来存储球的所有坐标和大小。在onDraw()中,它应该遍历集合并在正确的位置上绘制正确尺寸的球。