Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将drawCircle()的x、y坐标传递给drawLine()_Android_Android Canvas_Actionlistener_Touch Event_Ondraw - Fatal编程技术网

Android 将drawCircle()的x、y坐标传递给drawLine()

Android 将drawCircle()的x、y坐标传递给drawLine(),android,android-canvas,actionlistener,touch-event,ondraw,Android,Android Canvas,Actionlistener,Touch Event,Ondraw,我试图在两个圆圈之间划一条线。我在画布上画了两个圆,这两个圆有它们的cx和cy点我想把这两个圆的cx和cy传递给drawLine()的startx,starty和stopx,stopy。因此,应在这两个圆之间画一条线。这两个圆可以彼此平行,也可以彼此水平。到目前为止,我计划将动作侦听器应用于圆,以获得它们的x和y坐标。我在这里面临的问题是drawCircle()方法调用位于onDraw()中,lineDraw()方法调用位于onTouch()。我在下面分享了我的代码,请建议解决方案,这样我就可以

我试图在两个圆圈之间划一条线。我在画布上画了两个圆,这两个圆有它们的cx和cy点我想把这两个圆的cx和cy传递给drawLine()的startx,starty和stopx,stopy。因此,应在这两个圆之间画一条线。这两个圆可以彼此平行,也可以彼此水平。到目前为止,我计划将动作侦听器应用于圆,以获得它们的x和y坐标。我在这里面临的问题是drawCircle()方法调用位于onDraw()中,lineDraw()方法调用位于onTouch()。我在下面分享了我的代码,请建议解决方案,这样我就可以将圆的坐标传递给drawLine()。

package com.example.circleline;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnTouchListener 
{

    ImageView imageView;
    Bitmap bitmap;
    Canvas canvas;
    Paint paint;
    Paint pDot  = new Paint();
    float downx=0,downy=0,upx=30,upy=50;
    int cols = 5;
    int rows = 6;
    @SuppressWarnings("deprecation")
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView=(ImageView)this.findViewById(R.id.imageView1);

        Display currentDisplay= getWindowManager().getDefaultDisplay();
        float dw=currentDisplay.getWidth();
        float dh=currentDisplay.getHeight();
        bitmap=Bitmap.createBitmap((int) dw, (int)dh, Bitmap.Config.ARGB_8888);
        canvas=new Canvas(bitmap);
        paint=new Paint();
        paint.setColor(Color.BLUE);
        imageView.setImageBitmap(bitmap);
        dw=canvas.getWidth()/(cols+1);
        dh=canvas.getDensity()/(rows+1);
        for (int y=0;y<rows;y++)
        {
            for (int x=0;x<cols;x++)
            {
                canvas.drawCircle((x + 1) * dw, (y + 1) *(3* dh), 20, pDot);
            }
        }
        imageView.setOnTouchListener(this);
        //canvas.drawCircle(upx, upy, 20, pDot);
    }


    public boolean onTouch(View v, MotionEvent e) {
        int action=e.getAction();
        switch(action)
        {
        case MotionEvent.ACTION_DOWN:
            downx=e.getX();
            downy=e.getY();
            Log.d("Umar", String.valueOf(downx));
            Log.d("Farooq", String.valueOf(downy));
            break;
        case MotionEvent.ACTION_MOVE:
            break;
        case MotionEvent.ACTION_UP:
            upx=e.getX();
            upy=e.getY();
            canvas.drawLine(downx, downy, upx, upy, paint);
            imageView.invalidate();
            break;
        case MotionEvent.ACTION_CANCEL:
            break;
            default:
                break;
        }
        return true;
    }

}
package com.example.circleline;
导入android.app.Activity;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.Display;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.view.OnTouchListener;
导入android.widget.ImageView;
公共类MainActivity将活动实现扩展到TouchListener
{
图像视图图像视图;
位图;
帆布;
油漆;
油漆pDot=新油漆();
浮动向下x=0,向下y=0,向上x=30,向上y=50;
int cols=5;
int行=6;
@抑制警告(“弃用”)
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=(imageView)this.findViewById(R.id.imageView1);
Display currentDisplay=getWindowManager().getDefaultDisplay();
float dw=currentDisplay.getWidth();
float dh=currentDisplay.getHeight();
bitmap=bitmap.createBitmap((int)dw,(int)dh,bitmap.Config.ARGB_8888);
画布=新画布(位图);
油漆=新油漆();
油漆。设置颜色(颜色。蓝色);
设置图像位图(位图);
dw=canvas.getWidth()/(cols+1);
dh=canvas.getDensity()/(行+1);

对于(int y=0;y也将lineDraw()放在onDraw()中。将所有绘图操作放在onDraw()中,它们不属于其他任何地方。在onTouch中,只需保存x/y,然后在onDraw()中在x/y处绘制。

请解释我如何在圆上应用动作侦听器,以便在我触摸圆时,它应返回其x,y坐标。由于我使用“循环”绘制圆网格,因此我将如何唯一地识别单击的圆。在所有圆上循环,并检查从触摸到圆x/y的距离。选择圆最小距离。想法是线应该在两个相邻的圆之间,它们可以相互平行,也可以相互垂直。问题是如何选择某个圆?我对在圆上实现actionListener感到困惑。