У меня проблема с функцией Handle.postDelay в Android - PullRequest
0 голосов
/ 04 февраля 2020

В основном у меня есть TextView, который нужно переместить с правой стороны на другую (я тестирую что-то для другого проекта). Вместо этого все по-прежнему. Ничего не выполняется.

Еще один момент, на который следует обратить внимание: если я удаляю оператор if, что необходимо в моем случае, все работает просто отлично. Я думал, что условие ложно, поэтому я добавил другое утверждение. То же самое произошло - ничего. Я проверил, является ли условие ложным - это было правдой. Таким образом, код внутри оператора if должен был быть выполнен.

Мне все кажется логичным, но я могу ошибаться. Не могли бы вы помочь мне? Что я могу изменить? У тебя другой подход к моей проблеме? Спасибо!

PS: проблема не в анимации TextView. Проблема заключается в задержке.

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:background="#000000"
        android:text="0"
        android:textColor="#000000" />
</RelativeLayout>

Java:

package com.nicksoft.test;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.widget.TableLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {
    int ind = -1;
    private Handler h = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        r.run();
    }
    private Runnable r = new Runnable() {
        @Override
        public void run() {
            if(findViewById(R.id.textView).getX()>0) {
                findViewById(R.id.textView).setTranslationX(ind);
                ind--;
                h.postDelayed(r,5);
            }
        }
    };
}

Ответы [ 3 ]

0 голосов
/ 04 февраля 2020

Вы можете попытаться сделать это с помощью библиотеки daimajia AndroidViewAnimations https://github.com/daimajia/AndroidViewAnimations ... вы можете просто нарезать ее влево, а затем сделать ее невидимой ...

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

yourTextView = (TextView) findViewById(R.id.textView);
YoYo.with(Techniques.SlideOutLeft).duration(2500).playOn(yourTextView); //take 2500ms to slide
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            yourTextView.setVisibility(View.INVISIBLE);
        }
    },2500);}
0 голосов
/ 04 февраля 2020

Ничего не работает, потому что getX возвращает 0. Внутри onCreate stage View не имеет реальных координат, поскольку макет еще не построен, а getX возвращает значение по умолчанию 0, а postDelayed не вызывается. Вы звоните r.run(); слишком рано.

Вам следует подождать, пока не закончится этап макета. Все виды получат свои координаты. Тогда getX вернет вам что-то значимое, и ваш код будет работать.

Если вам не требуется на 100% использование такого пользовательского подхода для «анимации», используйте стандартные способы платформы, например PropertyAnimator

0 голосов
/ 04 февраля 2020

Еще один способ сделать простую анимацию более понятным - использовать конструктор animate для самого представления. Возможно, вам придется получить ширину экрана, как я сделал, если вы будете sh перемещаться по всему экрану.

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nick);
        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        findViewById(R.id.textView).animate().translationXBy(displayMetrics.widthPixels * -1).setDuration(displayMetrics.widthPixels * 5).setStartDelay(5L);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...