В моем приложении, когда пользователь касается экрана, рисуется круг, и если круг уже нарисован в точке a, тогда другой круг не может быть нарисован там.
, когда я использую холст.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(...)
, и он охватил весь экран, так что я знаю, что это не просто растровое изображение не растягивается на дно.Высота макета меньше, чем высота всего остального, а ширина макета такая же, как и у всех остальных, но когда я использую layout.getHeight и layout.getWidth в моем onResume, они всегда возвращают 0, поэтому я не могудействительно используйте это.
Я действительно понятия не имею, что это вызывает.Я также попробовал это на двух эмуляторах и получил тот же самый ответ.Любая помощь будет принята с благодарностью.
Кроме того, если я коснусь нарисованного круга (ближе к нижней части экрана), то над ним будет нарисован еще один круг, но если я коснусь того места, где ранее нажал,тогда новый круг не будет нарисован, что на самом деле и должно быть.круг просто не отображается на экране правильно.