Я пытаюсь понять, что происходит, когда я использую 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.Это заставило меня задать вопрос, как это все работает?