Android:画布上选择项目的触摸事件

Android:画布上选择项目的触摸事件,android,touch-event,Android,Touch Event,我在画布上画了许多圆圈,想知道其中哪一个被触动了。 一种解决方案是创建一个与屏幕大小相同的位图,并绘制屏幕上仅具有不同颜色的圆圈的副本,以便在调用getPixel()时,位图能够识别单击的圆圈。我的问题是我不知道如何在位图上画一个圆。。。也就是说,如何将位图绘制为画布上的图形 Paint paint; Bitmap screen; int w,h; int px=-1,py=-1; //coordinate @Override protected void onMeasure(int wi

我在画布上画了许多圆圈,想知道其中哪一个被触动了。 一种解决方案是创建一个与屏幕大小相同的位图,并绘制屏幕上仅具有不同颜色的圆圈的副本,以便在调用getPixel()时,位图能够识别单击的圆圈。我的问题是我不知道如何在位图上画一个圆。。。也就是说,如何将位图绘制为画布上的图形

Paint paint;
Bitmap screen;

int w,h;
int px=-1,py=-1; //coordinate 

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    //registriamo le dimensioni della view
    w=MeasureSpec.getSize(widthMeasureSpec);
    h=MeasureSpec.getSize(heightMeasureSpec);
    setMeasuredDimension(w,h);
}

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);

    Bitmap.Config conf = Bitmap.Config.ARGB_8888;  //Each pixel is stored on 4 bytes
    screen=Bitmap.createBitmap(w,h, conf);

    paint=new Paint(); // pennello
    paint.setColor(Color.RED);   
    paint.setAntiAlias(true);   
}

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    if(px==-1&&py==-1){ // se non abbiamo ancora settato le coordinate, posizioniamo la bmp al centro
        px=w/2-bw/2; //metà della larghezza view, meno metà della figura
        py=h/2-bh/2; //metà dell'altezza view, meno metà della figura
    }

    canvas.drawCircle(px, py, 70, paint);       
}

public void updatePosition(int x, int y) {      

    invalidate();
}
}

您想创建与位图相关联的画布,如下所示

gCanvas = new Canvas();
gCanvas.setBitmap(yourBitmap);
然后用它作为画布,画出你想要的

编辑:如果我不清楚的话,你在画布上画的一切就像你在位图上画的一样。然后根据你的X,Y得到颜色并进行比较

希望这有助于你享受工作

编辑:工作示例

public class MainActivity extends Activity {
private Bitmap image;
private int width;
private int height;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.clickete);

    Display display = getWindowManager().getDefaultDisplay();               

    width = display.getWidth();
    height = display.getHeight();

    createClickArea();

    findViewById(R.id.clickLayout).setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int result = whichCircle((int)event.getRawX(), (int)event.getRawY());
            Log.i("Color clicked: ", String.valueOf(result));
            return false;
        }
    });

    Drawable dr = new BitmapDrawable(getResources(), image);        

    findViewById(R.id.clickLayout).setBackgroundDrawable(dr);
}

private void createClickArea(){
    Bitmap.Config conf = Bitmap.Config.ARGB_8888; 

    image = Bitmap.createBitmap(width, height, conf);

    Canvas gCanvas = new Canvas();
    gCanvas.setBitmap(image);
    Paint paint = new Paint();
    paint.setStyle(Style.FILL);
    gCanvas.drawRGB(0, 0, 0);       
    for(int i = 0; i < 4; i++){
        switch(i){
        case 0: paint.setColor(Color.WHITE); break;
        case 1: paint.setColor(Color.YELLOW); break;
        case 2: paint.setColor(Color.BLUE); break;
        case 3: paint.setColor(Color.GREEN); break;
        }
        gCanvas.drawCircle((i + 1) * 80, (i + 1) * 80, 40, paint);
    }
}

private int whichCircle(int x, int y){
    int result = 0;
    int color = image.getPixel(x, y);
    switch(color){
    case Color.WHITE: result = 1; break;
    case Color.YELLOW: result = 2; break;
    case Color.BLUE: result = 3; break;
    case Color.GREEN: result = 4; break;
    }
    return result;
}

}
公共类MainActivity扩展活动{
私有位图图像;
私有整数宽度;
私人内部高度;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.clickete);
Display Display=getWindowManager().getDefaultDisplay();
宽度=display.getWidth();
高度=display.getHeight();
createClickArea();
findViewById(R.id.clickLayout).setOnTouchListener(新的OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
int result=whichCircle((int)event.getRawX(),(int)event.getRawY());
Log.i(“单击颜色:”,String.valueOf(结果));
返回false;
}
});
Drawable dr=新的位图Drawable(getResources(),image);
findViewById(R.id.clickLayout)。可设置背景图(dr);
}
私有void createClickArea(){
Bitmap.Config conf=Bitmap.Config.ARGB_8888;
image=Bitmap.createBitmap(宽度、高度、形态);
Canvas gCanvas=新画布();
gCanvas.setBitmap(图像);
油漆=新油漆();
油漆.设置样式(样式.填充);
gCanvas.drawRGB(0,0,0);
对于(int i=0;i<4;i++){
开关(一){
案例0:paint.setColor(Color.WHITE);中断;
案例1:paint.setColor(Color.YELLOW);中断;
案例2:paint.setColor(Color.BLUE);中断;
案例3:paint.setColor(Color.GREEN);中断;
}
gCanvas绘图圈((i+1)*80,(i+1)*80,40,油漆);
}
}
私有整数whichCircle(整数x,整数y){
int结果=0;
int color=image.getPixel(x,y);
开关(彩色){
案例颜色:白色:结果=1;中断;
案例颜色:黄色:结果=2;中断;
案例颜色:蓝色:结果=3;中断;
案例颜色:绿色:结果=4;中断;
}
返回结果;
}
}

只需解决不推荐的方法并隐藏位图,很抱歉,我现在没有时间替换它,我的午餐变冷了:)'。请记住全屏操作或根据位图位置调整rawX、rawY。

您可以尝试此操作,因为通过实现surfaceholder.callback,可以在ondraw函数中将位图绘制为要在画布上首先绘制的背景

canvas.drawBitmap(bgrReverse, fromRect2, toRect2, null);

然后实现onTouch()事件,在该事件中,您将获得手指移动的指针,并获得这些移动,您可以将圆绘制到接收到的特定onTouch()并移动手指

我想给每个圆画一个不同的颜色以便识别它,否则我不知道我点击圆是为了什么(…{int I=0;paint.setColor(I);canvas.drawCircle(px,py,70,paint);}这个区域是可见的吗?为什么你画它们只是为了看看是否有人点击了它。你有多少个圆圈?如果你有100种,我会支持你的方法。但如果你不知道,只要记住圆心和半径,通过你的数组做一些数学运算,然后第一个就可以了。或者,如果你确定你想要这个,告诉我什么是问题。你有你的位图和画布可以画,我现在看到你如何画它,点击只需询问颜色的位图。位图根本不可见,我只需要计算出点击的圆圈,然后计算出它的坐标。目标是用一条线连接两个圆,所有圆都是由​​由用户触摸。也许你有一些例子或教程,我可以帮助你?非常好,谢谢