2016-06-10 3 views
0

В моем 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> 

ответ

0

Canvas.drawCircle работает с этими параметрами:

  1. сх поплавок: Х-координата центра cirle быть обращен
  2. су поплавка: Y-координата центра cirle быть обращен
  3. радиусом поплавка: Радиус cirle быть обращаются
  4. краски краска: краска для рисования круга

Поэтому вместо того, чтобы вычитая радиус при вызове его, просто вызовите DrawCircle непосредственно:

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

источника : Android Canvas doc

+0

Вы проверили мой пример кода? –

+0

Ну, это кажется довольно прямым для меня. Когда вы получаете событие касания, вы перемещаете красный шар так, чтобы он был центрирован на пальце, что хорошо. Но setX() и setY() не работают так же, как drawCircle. В первом случае координаты для верхнего левого угла, а последние - для центра круга. Вы проверили мой код? – NSimon

+0

Да, он все еще не работает –

Смежные вопросы