在我的应用程序中,当用户触摸屏幕时,绘制一个圆,并且如果圆点已经在点a处绘制,则不能在那里绘制另一个圆。画圆不准确
当我使用canvas.drawCircle(...)时,它是无情的。如果我点击靠近屏幕的顶部,那么它只是非常细微地丢失了我轻敲它的位置(稍微向左或向右)。我越走越远离我的圈子就是我触摸的地方。如果我触摸屏幕的左侧,则该圆圈会进入触摸点的右侧,如果我触摸屏幕的右侧,则该圆圈位于左侧。
这里是我的代码:
public void onCreate(...){
super.onCreate();
setcontentView(...);
drawnX = new ArrayList<Float>();
drawnY = new ArrayList<Float>();
layout = (ImageView)findViewById(R.id.layout);
layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent me) {
newY = me.getY();
newX = me.getX();
int action = me.getAction();
if (action==0){
Log.v(tag, "New Touch");
Log.i(tag, String.valueOf("Action " + action +
" happened at X,Y: " + "("+newX+","+newY + ")"));
getDistance(newX, newY);
}
return true;
}
});
@Override
public void onResume(){
super.onResume();
display = getWindowManager().getDefaultDisplay();
screenHeight = display.getHeight();
screenWidth = display.getWidth();
bitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
paint = new Paint();
circleRadius = screenHeight/50;
}
public void getDistance(float xNew, float yNew){
// here I compare the new touch x and y values with the x and y values saved
// in the Array Lists I made above. If distance is > circleRadius, then:
drawPoint(xNew, yNew)
}
public void drawPoint(final float x, final float y){
minDistance = Float.NaN;
new Thread(new Runnable(){
@Override
public void run(){
paint.setColor(Color.RED);
canvas.drawCircle(x, y, circleRadius, paint);
layout.post(new Runnable(){
@Override
public void run(){
layout.setImageDrawable(new BitmapDrawable(bitmap));
//I have also tried setImageBitmap and setBackgroundDrawable
}
});
}
}).start();
}
诠释了这一切的过程中,我也做了一些记录在drawPoint,它表明了x和y坐标匹配这是在onTouch得到。
我也试过maknig它LinearLayout,但是有相同的效果。
而且,位图大小与屏幕大小和画布大小相匹配。同时,为了测试我做
canvas.drawARGB(...)
,它覆盖了整个屏幕,所以我知道这不只是位图没有被拉伸到了谷底。布局的高度小于其他所有的高度,并且布局的宽度与所有其他布局相同,但是当我在我的onResume中使用layout.getHeight和layout.getWidth时,它们总是返回0,所以我不能真的使用它。
我真的不知道是什么原因造成的。我也尝试了两个模拟器并得到了相同的响应。任何帮助将不胜感激。另外,如果我点击绘制的圆圈(朝向屏幕底部),另一个圆圈将被绘制在该圆圈上方,但是如果我点击之前拍摄的地方,则不会绘制新的圆圈,这真的是想要发生的事情。该圆圈只是没有正确显示在屏幕上。
当我固定screenHeight和screenWidth实际上是layout.getHeight()和layout.getWidth()时,解决了这个问题。我不得不将它包装在新的处理程序()中。尽管如此,postDelayed(runnable,5000)为它们返回一个值。在8小时的发布时限结束后,我会发布完整的答案 – Jakar