android画布没有绘制触摸位置

时间:2016-06-03 11:26:15

标签: android canvas

我使用canvas制作一个简单的绘图应用程序。我正在使用onTouchEvent来处理触摸事件。我在垂直轴上遇到问题绘制点与触摸位置不同。当我向上移动时,触摸位置和绘制位置之间的垂直间隔增加。为了使我的问题更清楚,我附上我的应用程序的截图。 screen shot

蓝线表示实际触摸位置和红色绘制位置。

这是我的代码 Mainactivity

'd'

xml layout

public class MainActivity extends AppCompatActivity{
    Path mPath;
    Canvas canvas;
    Paint paint;
    float pointX;
    float pointY;
    int height;
    RelativeLayout layout;
    int layoutHeight;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        layout=(RelativeLayout)findViewById(R.id.main_layout);
        DisplayMetrics dp=getResources().getDisplayMetrics();

        WindowManager windowManager=getWindowManager();
        height=windowManager.getDefaultDisplay().getHeight();
        int width =windowManager.getDefaultDisplay().getWidth();

        Bitmap bg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        layout.setBackground(new BitmapDrawable(bg));
        canvas=new Canvas(bg);
        paint=new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(4);
        mPath=new Path();
        canvas.drawPath(mPath,paint);
        canvas.drawBitmap(bg,0,0,paint);
    }

    public void clearCanvas(View v) {
        mPath.reset();
        canvas.drawColor(0, PorterDuff.Mode.CLEAR);
        layout.invalidate();
    }
    //override the onTouchEvent
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        pointX = event.getX();
        pointY = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.v("TAG"," action down x:"+pointX+" y:"+pointY);
                mPath.moveTo(pointX,pointY);
                break;
            case MotionEvent.ACTION_MOVE:
                Log.v("TAG"," actionmove x:"+pointX+" y:"+pointY);
                mPath.lineTo(pointX,pointY);
                canvas.drawPath(mPath,paint);
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        layout.invalidate();
        return true;
    }
} 

2 个答案:

答案 0 :(得分:2)

使用:event.getRawX()

返回此事件的原始原始X坐标。对于屏幕上的触摸事件,这是事件在屏幕上的原始位置,然后根据包含的窗口和视图进行调整。

<强> UPD: 我只是试图重复你的应用程序,一切正常

activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent">

     <com.example.Test
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

Test.java

public class Test extends View {

    private Path path = new Path();
    private Paint paint = new Paint();
    {
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(4);
        paint.setStyle(Paint.Style.STROKE);
    }

    public Test(Context context) {
        super(context);
    }

    public Test(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public Test(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public Test(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(path, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_MOVE:
                path.lineTo(event.getX(), event.getY());
                break;
        }
        invalidate();
        return true;
    }

}

答案 1 :(得分:0)

你的问题是你的画布X轴与屏幕X轴的位置相同,但你的画布Y轴偏离屏幕Y轴(&#34; MyDrawingApp&#34;偏移的条形图集)它的高度)。

当你&#34; getY()&#34;正在发生的事情是它返回触摸的位置作为参考整个屏幕而不是你的画布。

一种解决方案是将画布的位置放在屏幕上并将其减去&#34; getY()&#34;值。这样做可以触摸画布。

我希望你能理解我,我不是英国人。

问候