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
是的,它仍然無法使用 –