Android 画圆不准确
在我的应用程序中,当用户触摸屏幕时,会绘制一个圆,如果已经在a点绘制了一个圆,则无法在该点绘制另一个圆 当我使用canvas.drawCircle(…)时,它是不准确的。如果我点击靠近屏幕顶部的位置,那么我点击的位置(稍微向左或向右)就会非常微小地丢失。我走得越远,我的圆圈离我接触的地方就越远。如果我触摸屏幕的左侧,圆圈就在触摸点的右侧,如果我触摸屏幕的右侧,圆圈就在左侧 这是我的密码:Android 画圆不准确,android,bitmap,drawable,Android,Bitmap,Drawable,在我的应用程序中,当用户触摸屏幕时,会绘制一个圆,如果已经在a点绘制了一个圆,则无法在该点绘制另一个圆 当我使用canvas.drawCircle(…)时,它是不准确的。如果我点击靠近屏幕顶部的位置,那么我点击的位置(稍微向左或向右)就会非常微小地丢失。我走得越远,我的圆圈离我接触的地方就越远。如果我触摸屏幕的左侧,圆圈就在触摸点的右侧,如果我触摸屏幕的右侧,圆圈就在左侧 这是我的密码: public void onCreate(...){ super.onCreate(); set
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();
}
它覆盖了整个屏幕,所以我知道不仅仅是位图没有延伸到底部。版面的高度小于其他所有内容的高度,版面的宽度与其他内容相同,但当我在onResume中使用layout.getHeight和layout.getWidth时,它们总是返回0,因此我无法真正使用它
我真的不知道是什么引起的。我也在两个模拟器上试过,得到了相同的响应。任何帮助都将不胜感激
此外,如果我点击绘制的圆圈(朝向屏幕底部),则会在该圆圈上方绘制另一个圆圈,但如果我点击之前点击的位置,则不会绘制新的圆圈,这确实是应该发生的。圆圈没有正确显示在屏幕上。我找到了答案
奇怪的是,尽管位图的宽度与布局的宽度相匹配,但当我进行更多的测试时,我发现尺寸在左右两侧实际上也不匹配
我没有使用layout.getWidth()和layout.getHeight(),因为它在onResume()中返回0
但是,我认为与display.getHeight()不同的高度很可能是导致问题的原因,所以我基本上做到了:
new Handler().postDelayed(getLayoutSizeRunnable, 5000);
其中getLayoutSizeRunnable本质上是:
screenWidth = layout.getWidth();
screenHeight = layout.getHeight();
然后一切都很顺利
对于我的应用程序中的使用,我将使用if语句,这样第一次创建触摸点时,将计算布局大小,并基于它创建位图。当我将屏幕高度和屏幕宽度固定为layout.getHeight()和layout.getWidth()时,解决了问题。不过,我必须用new handler().postDelayed(runnable,5000)来为它们返回一个值。我会在8小时的发布时间过后发布完整答案
screenWidth = layout.getWidth();
screenHeight = layout.getHeight();