В моем Android-проекте я столкнулся с некоторыми трудностями в коде чертежа, поэтому я представил MCVE ниже, чтобы продемонстрировать проблему, которая у меня есть.Android: нужна помощь в точном расположении фигуры
Запустив этот пример и коснувшись экрана, вы увидите два круга.
Вы можете видеть, что красный цвет расположен точно и последовательно вокруг точки касания.
Для зеленого вы можете видеть, что его положение является случайным при повторном касании экрана.
Красный круг создан с использованием ImageView
с источником ball.xml
. Для зеленого, это делается Canvas.drawCircle()
.
Итак:
Как исправить код, чтобы сделать красный круг и зеленый круг появляются точно в том же месте, на ощупь, независимо от разрешения и точек на дюйм экрана?
Кроме того, кстати, то 500x1000 размер (Bitmap.createBitmap(500, 1000)
) просто устанавливать произвольно, оно должно быть в соответствии с размером экрана устройства.
MainActivity
package com.prime.testdraw;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
ImageView ivPhoto;
FrameLayout fl;
ImageView ivBall;
private Canvas myCV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ivPhoto = ((ImageView) findViewById(R.id.ivPhoto));
fl = ((FrameLayout) findViewById(R.id.fl));
ivBall = ((ImageView) findViewById(R.id.ivBall));
myCV = initDraw(ivPhoto);
ivPhoto.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
myCV = initDraw(ivPhoto);
ivBall.setX(motionEvent.getX() - ivBall.getWidth()/2);
ivBall.setY(motionEvent.getY() - ivBall.getHeight()/2);
Paint p = new Paint();
p.setStrokeWidth(3);
p.setColor(Color.GREEN);
p.setTextSize(100);
int radius = 40;
p.setStyle(Paint.Style.STROKE);
myCV.drawCircle(motionEvent.getX() - radius, motionEvent.getY() - radius, radius, p);
ivPhoto.invalidate();
return false;
}
});
}
private Canvas initDraw(ImageView imageView) {
Bitmap bmp = Bitmap.createBitmap(500, 1000, Bitmap.Config.RGB_565);
Canvas cv = new Canvas(bmp);
imageView.setImageDrawable(new BitmapDrawable(getResources(), bmp));
imageView.invalidate();
return cv;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fl">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/ivPhoto"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ImageView
android:layout_width="52dp"
android:layout_height="52dp"
android:id="@+id/ivBall"
android:layout_gravity="left|top"
android:src="@drawable/ball" />
</FrameLayout>
ball.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
<stroke
android:width="4dp"
android:color="#FF0000" />
<gradient android:startColor="#FFFF0000" android:endColor="#80FF0000"
android:angle="270"/>
</shape>
Вы проверили мой пример кода? –
Ну, это кажется довольно прямым для меня. Когда вы получаете событие касания, вы перемещаете красный шар так, чтобы он был центрирован на пальце, что хорошо. Но setX() и setY() не работают так же, как drawCircle. В первом случае координаты для верхнего левого угла, а последние - для центра круга. Вы проверили мой код? – NSimon
Да, он все еще не работает –