在我的应用中,当用户触摸屏幕时,会绘制一个圆圈,如果已经在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,所以我不能真的用那个。
我真的不知道造成它的原因。我也在两个模拟器上尝试了它并得到了相同的响应。任何帮助将不胜感激。
此外,如果我点击绘制的圆圈(朝向屏幕底部),则会在该圆圈上方绘制另一个圆圈,但如果我点击之前点击的位置,则不会绘制新圆圈,真的是假设发生的事情。圆圈没有正确显示在屏幕上。
答案 0 :(得分:0)
我找到了答案。
奇怪的是,即使位图的宽度与布局的宽度相匹配,当我进行更多的测试时,我发现尺寸实际上并不是左右两侧合在一起。
我没有使用layout.getWidth()和layout.getHeight(),因为它在onResume()
中返回0但是,我认为display.getHeight()的不同高度可能导致问题,所以我基本上做了:
new Handler().postDelayed(getLayoutSizeRunnable, 5000);
其中getLayoutSizeRunnable基本上是:
screenWidth = layout.getWidth();
screenHeight = layout.getHeight();
然后一切都很完美。
对于我的应用程序中的用法,我将使用if语句,因此第一次制作触摸点时,将计算布局大小,并根据它创建位图。