0
在我的Android项目中,我在绘图代码中遇到了一些困难,所以我在下面组成了一个MCVE来演示我的问题。Android:需要形状图的准确位置帮助
通过运行此示例,并在屏幕上执行触摸,您可以看到两个圆圈出现。
您可以看到红色的触摸点周围的位置准确一致。
对于绿色的,你可以看到它的位置在重复触摸屏幕时是随机的。
红色圆圈使用ImageView
创建,源为ball.xml
。对于绿色的,由Canvas.drawCircle()
完成。
所以:
如何纠正 出现在完全相同的点上的触摸的代码,以使红圈和绿圈,无论画面的分辨率和DPI的?
此外,顺便说一句,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
是的,它仍然无法使用 –