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

是的,它仍然無法使用 –