Просмотр для эффективной и плавной автоматической прокрутки текста

Я хочу создать текстовое представление, которое медленно прокручивается вниз.

Очевидное решение, которое я могу придумать, - это использовать TextView или что-то в этом роде и сделать обратный вызов, который многократно прокручивается на небольшую величину и регистрируется, скажем, еще через 1/24 секунды.

Этот метод очень неэффективен? Есть ли более экономичный способ достижения той же цели?


person Phil    schedule 05.05.2015    source источник
comment
возможный дубликат Android-анимаций, похожих на вертикальную рамку   -  person samgak    schedule 05.05.2015


Ответы (1)


Рекомендуемый способ - использовать метод postDelay и остановить прокрутку после невидимого вида. Следующий фрагмент кода является примером реализации автоматической прокрутки. Надеюсь, это будет полезно.

public class MainActivity extends ActionBarActivity implements Runnable {

private TextView textView;

private String[] lines = new String[] { "line 11111111111111111111111",
        "line 22222222222222222222222", "line 33333333333333333333333",
        "line 44444444444444444444444", "line 55555555555555555555555" };

private final int NUM_OF_LINES = lines.length;

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

    textView = (TextView) findViewById(R.id.textview);
}

/*
 * (non-Javadoc)
 * 
 * @see android.support.v4.app.FragmentActivity#onResume()
 */
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    textView.postDelayed(this, 1000);
}

/*
 * (non-Javadoc)
 * 
 * @see android.support.v4.app.FragmentActivity#onPause()
 */
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    textView.removeCallbacks(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void run() {
    // TODO Auto-generated method stub

    String[] dst = new String[NUM_OF_LINES];

    System.arraycopy(lines, 1, dst, 0, NUM_OF_LINES - 1);
    dst[NUM_OF_LINES - 1] = lines[0];

    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < NUM_OF_LINES; i++) {
        builder.append(dst[i]);
        if (i != NUM_OF_LINES - 1) {
            builder.append("\n");
        }
    }

    textView.setText(builder.toString());

    lines = dst;
    textView.postDelayed(this, 1000);
}
}

И TextView в макете.

<TextView
    android:id="@+id/textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:lines="5"
    android:maxLines="5"
    android:singleLine="false"
    android:text="@string/hello_world" />
person alijandro    schedule 05.05.2015