2014-06-09 1 views
7

Я застрял с получением x & y координаты изображения для всех разрешений.Как получить одинаковые координаты для изображения для всех разрешений в android?

  1. 320, для устройств с конфигурациями экрана, таких как:
    • 240x320 ldpi (QVGA телефон)
    • 320х480 MDPI (телефон)
    • 480х800 ИПЧР (высокая трубка плотности)
  2. 480, для экранов, таких как 480x800 mdpi (планшет/телефон).
  3. 600, для экранов, таких как 600x1024 mdpi (7 "таблетка).
  4. 720, для экранов, таких как 720x1280 mdpi (10" планшет).

Я создал изображение с оригинальным размером изображения, например, 1500 x 1119. Когда я коснулся изображения, я могу получить координаты, используя onTouch(). Моя проблема, если координаты меняются во всех устройствах. Я получаю разные x & y значения в разных обманах. Я не могу получить такие же значения x & y для всех разрешений. Как я могу это решить?

+0

Вы хотите, X/Y координаты точки на изображении, которое было отводы? –

+0

Yup. Но эти значения x/y должны быть преобразованы для всех разрешений. Например, в 600x1024 = 300 400 значения должны быть рассчитаны в 1080x1920 =? – malavika

+0

Я предполагаю, что вы используете обычный «ImageView», и если да, можете ли вы разместить XML-макет? –

ответ

0

Вот несколько более общее решение, чем требуется для вашего конкретного макета. Это предполагает, что вы знаете размеры исходного изображения и хотите знать координаты на нем, которые были задействованы, игнорируя размер и разрешение экрана. Хотя ваш макет задает ширину и высоту, которая соответствует исходному изображению, это будет обрабатывать макеты с шириной и высотой, заданными либо wrap_content, либо match_parent, при условии, что вы используете один из типов шкалы, который соответствует всему изображению внутри границ обзора и сохраняет соотношение сторон (например, fitXY).

Я не пробовал это внутри ScrollView, так как у вас есть, но в теории все должно быть хорошо.

int sourceWidth = 1500; 
int sourceHeight = 1119; 

// Find view dimensions 
int width = view.getWidth(); 
int height = view.getHeight(); 

// Assuming image has been scaled to the smaller dimension to fit, calculate the scale 
float wScale = (float)width/(float)sourceWidth; 
float hScale = (float)height/(float)sourceHeight; 
float scale = Math.min(wScale, hScale); 

// Find the offset in the direction the image doesn't fill the screen 
// For ImageViews that wrap the content, both offsets will be 0 so this is redundant 
int offsetX = 0; 
int offsetY = 0; 
if (wScale <= hScale) { 
    offsetY = (int)((height/2) - ((scale * sourceHeight)/2)); 
} else { 
    offsetX = (int)((width/2) - ((scale * sourceWidth)/2)); 
} 

// Convert event coordinates to image coordinates 
int sourceX = (int)((event.getX() - offsetX)/scale); 
int sourceY = (int)((event.getY() - offsetY)/scale); 
0

Наконец-то я нашел ответ. Мне это понравилось.

Первоначально я создал свой макет, как это.

new_lay.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#FFFFFF" 
android:orientation="vertical" > 

<ScrollView 
    android:id="@+id/sv" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#FFFFFF" 
    android:orientation="vertical" > 

    <HorizontalScrollView 
     android:id="@+id/hv" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#FFFFFF" > 

     <FrameLayout 
      android:id="@+id/ground_gry_fl1" 
      android:layout_width="3193dp" 
      android:layout_height="1815dp" 
      android:background="#FFFFFF" > 

      <FrameLayout 
       android:id="@+id/zoom_lay1" 
       android:layout_width="3193dp" 
       android:layout_height="1815dp" 
       android:background="@drawable/mall_map" > 

       <ImageView 
        android:id="@+id/marker_image" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/ic_launcher" 
        android:visibility="invisible" > 
       </ImageView> 
      </FrameLayout> 
     </FrameLayout> 
    </HorizontalScrollView> 
</ScrollView> 

NewClass .Java

 public class NewClass extends Activity { 

ImageView mark; 

FrameLayout ground_gry_fl,zoom_lay; 
ScrollView sv; 

float val1 = 0.0f; 
float val2 = 0.0f; 

@SuppressLint("NewApi") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.new_lay); 
    sv=(ScrollView) findViewById(R.id.sv); 
    mark = (ImageView) findViewById(R.id.marker_image); 
    ground_gry_fl = (FrameLayout)findViewById(R.id.ground_gry_fl1); 
    zoom_lay = (FrameLayout)findViewById(R.id.zoom_lay1); 
    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 

      int height = metrics.heightPixels; 
    int width = metrics.widthPixels; 

    System.out.println("width"+width); 
     System.out.println("height"+height); 

    float densityDpi = metrics.density; 
      System.out.println("densityDpi" + densityDpi); 

    val1 = densityDpi * 1064; // here give random x value (co-ordinate) 
    val2 = densityDpi * 1253; // here give random y value (co-ordinate) 


    System.out.println("val1" + val1); 
    System.out.println("val2" + val2);   

    mark.setX(val1); 
    mark.setY(val2); 

    mark.setVisibility(View.VISIBLE); 

} 

} 

Он должен поместить такое же место во все разрешении устройства. Вы можете прокрутить изображение и увидеть точку. Его работы мелко для меня.

0

установите плотность отображения

float density = getActivity().getResources().getDisplayMetrics().density; 
    if (density == 4.0) { 
     displayMetrixDensity = 640; 
    } 
    if (density == 3.0) { 
     displayMetrixDensity = 480; 
    } 
    if (density == 2.0) { 
     displayMetrixDensity = 320; 
    } 
    if (density == 1.5) { 
     displayMetrixDensity = 160; 
    } 
    if (density == 1.0) { 
     displayMetrixDensity = 160; 
    } 
Смежные вопросы