【发布时间】:2011-08-21 22:53:59
【问题描述】:
在我的应用中,当用户触摸屏幕时,会画一个圆,如果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中得到的匹配。
我也尝试过将它设置为 LinearLayout,但效果相同。
而且,位图大小与屏幕大小和画布大小相匹配。另外,为了测试我做了
canvas.drawARGB(...)
它覆盖了整个屏幕,所以我知道这不仅仅是位图没有拉伸到底部。布局的高度小于其他所有内容的高度,并且布局的宽度与其他所有内容相同,但是当我在 onResume 中使用 layout.getHeight 和 layout.getWidth 时,它们总是返回 0,所以我不能真正使用它。
我真的不知道是什么原因造成的。我还在两个模拟器上尝试过,得到了相同的响应。任何帮助将不胜感激。
此外,如果我点击绘制的圆圈(朝向屏幕底部),则会在该圆圈上方绘制另一个圆圈,但如果我点击之前点击的位置,则不会绘制新的圆圈,这真的是假设发生的事情。圆圈只是没有正确显示在屏幕上。
【问题讨论】:
-
当我将 screenHeight 和 screenWidth 固定为实际上是 layout.getHeight() 和 layout.getWidth() 时,问题就解决了。不过,我必须将其包装在 new handler().postDelayed(runnable, 5000) 中才能为它们返回一个值。在 8 小时的发布时间框架过后,我将发布完整的答案