2016-06-10 48 views
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> 

回答

0

Canvas.drawCircle适合这些参数:

  1. CX浮动:所述cirle的中心的x坐标被绘制
  2. CY浮动:所述cirle的中心的y坐标被绘制
  3. 半径浮动:所述cirle的半径为绘制
  4. 涂料粉刷:用来代替从其减去调用时,它的半径画圆

因此油漆,只需直接调用画圆:

myCV.drawCircle(motionEvent.getX(), motionEvent.getY(), radius, p); 

来源:Android Canvas doc

+0

你测试了我的示例代码吗? –

+0

对我来说,这看起来很直接。 当您收到一个触摸事件时,您将移动红色球,使其以手指为中心,这很好。但是setX()和setY()与drawCircle不同。在第一个中,坐标是针对左上角的,而后者是针对圆的中心。你测试了我的代码吗? – NSimon

+0

是的,它仍然无法使用 –