Как андроид устраивает взгляды? - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь понять, что происходит, когда я использую setX и setY для динамического изменения положения просмотра, каков процесс, который использует Android для перевода этих значений и предварительного представления вида специально с различными плотностями экрана устройств, потому что, очевидно,из того, что я испытал, представление не перемещается к той же самой координате Y , я даже пытался установить Y () в постоянное число, и все же всегда есть сдвиг в результате.

Я сделал новый проект только для тестирования, это XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/relativeLayout_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layoutDirection="ltr"
>
<TextView
android:id="@+id/move_me"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Move this!"
android:layout_alignParentBottom="true"/>
<TextView
    android:id="@+id/here_to_stay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="Here!"
    />
<Button
    android:id="@+id/location_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Change Location"
    android:layout_centerHorizontal="true"/>

    </RelativeLayout>

, а это Java-файл:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity {
private final String CONTEXT = "MainActivity";
//define view variables
TextView moveThisTxtView;
TextView hereToStayTxtView;

Button changeLocationBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_main );

    moveThisTxtView = (TextView)findViewById( R.id.move_me );
    hereToStayTxtView = (TextView)findViewById( R.id.here_to_stay );
    changeLocationBtn = (Button)findViewById( R.id.location_btn );


    changeLocationBtn.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //get view position
            int[] textViewLocation = new int[2];
            int[] oldLocation = new int[2];
            moveThisTxtView.getLocationOnScreen( oldLocation );
            int oldPosX = oldLocation[0];
            int oldPosY = oldLocation[1];
            hereToStayTxtView.getLocationOnScreen( textViewLocation );
            final int targerPosX = textViewLocation[0];
            final int targetPosY = textViewLocation[1];
            Log.v(CONTEXT, "the here to stay x and y are:" + targerPosX + 
            ", " + targetPosY);
            Log.v(CONTEXT, "the view old x and y are:" + oldPosX+ ", " + 
             oldPosY);

            moveThisTxtView.setX(targerPosX);

            moveThisTxtView.setY(targetPosY);

        }
    } );


   }

@Override
public void onWindowFocusChanged (boolean hasFocus) {
    int[] newLocation = new int[2];
    moveThisTxtView.getLocationOnScreen( newLocation );
    int newPosX = newLocation[0];
    int newPosY = newLocation[1];
    Log.v(CONTEXT, "the new x and y are:" + newPosX + ", " + newPosY);
}
}

Понятия не имею, почему, но я толькоИмея проблему с координатой y, x всегда корректен во всех устройствах. Мне даже не нужно делить его на плотность, только y всегда неверен даже в устройствах mdp.Это заставило меня задать вопрос, как это все работает?

1 Ответ

0 голосов
/ 09 октября 2018

Пиксели - это отдельные точки света на дисплее.Как вы сказали, вид не всегда будет перемещаться в одно и то же место на дисплее, потому что разные дисплеи имеют разную плотность пикселей.Например, новый iPhone Xr издевается за такую ​​низкую плотность пикселей;Это огромный экран, но он дает вам только 720p.

Вы должны использовать независимые от плотности пиксели (dp) в качестве единицы измерения при настройке положения, высоты, ширины и других размерных атрибутов.Использование dp должно позволить вам отображать вид одинаково на любом устройстве.

В вашем случае вы хотите динамически менять позиции, но вы не можете определить dp в Java.Для этого вы можете создать dimens.xml в res/values со следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="my_dimen">48dp</dimen>
</resources>

Затем вы можете обратиться к этому значению, используя getResources().getDimension(R.dimen.my_dimen)

...