2013-06-06 2 views
3

Я работаю над приложением, в котором мне нужно сделать прокрутку текста на основе информации о наклоне устройства. Я попробовал несколько решений, но ничего не работает. Я в состоянии получить наклоняя информацию, используя следующий код: -android - наклон для прокрутки текста?

public class SensorActivity extends Activity implements SensorEventListener { 

    float[] mMagnetValues  = new float[3]; 
    float[] mAccelValues  = new float[3]; 
    float[] mOrientationValues = new float[3]; 
    float[] mRotationMatrix = new float[9]; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     SensorManager sensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE); 
     sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
       SensorManager.SENSOR_DELAY_NORMAL); 
     sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
       SensorManager.SENSOR_DELAY_NORMAL); 
     TextView txt1 = (TextView) findViewById(R.id.textView1); 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     switch (event.sensor.getType()) { 
      case Sensor.TYPE_ACCELEROMETER: 
       System.arraycopy(event.values, 0, mAccelValues, 0, 3); 
       break; 

      case Sensor.TYPE_MAGNETIC_FIELD: 
       System.arraycopy(event.values, 0, mMagnetValues, 0, 3); 
       break; 
     } 
     SensorManager.getRotationMatrix(mRotationMatrix, null, mAccelValues, mMagnetValues); 
     SensorManager.getOrientation(mRotationMatrix, mOrientationValues); 
     Log.e("Values", mOrientationValues[0] + " " + mOrientationValues[1] + " " + mOrientationValues); 
    }; 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { } 

    public void scrollTextUp() { 
     ScrollView scrollView = (ScrollView)findViewById(R.id.scroll); 
     scrollView.scrollBy(0, 5); 
    } 

    public void scrollTextBottom() { 
     ScrollView scrollView = (ScrollView)findViewById(R.id.scroll); 
     scrollView.scrollBy(0, -5); 
    } 
} 

Я предполагаю, что mOrientationValues[1] необходимо использовать для прокрутки, но, как использовать это значение является большим вопросом для меня прямо сейчас. Пожалуйста помоги.

Любая помощь была бы действительно оценена. Если вы нашли хороший учебник или пример, поделитесь им.

Спасибо.

+0

Возможно, scrollTo (int x, int y) вместо этого? – JRowan

+0

Да, я думаю, что было бы лучше cuz scrollBy будет продолжать прокручивать текст. Но большой вопрос в том, как использовать значение датчика для вычисления нового y для scrollview? – Varundroid

+0

Все значения варьируются от 1 до -1 вправо? Мой компьютер выгружен, его исправлено завтра – JRowan

ответ

2

Итак, после нескольких часов работы, это решение, которое я использовал. Требования к моим приложениям заключались в том, чтобы сделать прокрутку текста с удобочитаемой скоростью, поэтому я использовал постоянную скорость прокрутки, но я приветствую всех, чтобы улучшить этот ответ на основе скорости наклона и т. Д., Чтобы он мог помочь и другим.

TiltScrollController класс - класс

public class TiltScrollController implements SensorEventListener { 

    private SensorManager mSensorManager; 
    private Sensor mAccelSensor; 
    private Sensor mMagnetSensor; 
    private float mCurrentPosition; 
    private boolean isCurrentPositionSet = false; 
    private int count = 0; 
    private ScrollListener mListener; 

    float[] mMagnetValues  = new float[3]; 
    float[] mAccelValues  = new float[3]; 
    float[] mOrientationValues = new float[3]; 
    float[] mRotationMatrix = new float[9]; 

    public TiltScrollController(SensorManager sensorManager, ScrollListener listener) { 
     mSensorManager = sensorManager; 
     mListener = listener; 
     mAccelSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mMagnetSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     switch (event.sensor.getType()) { 
      case Sensor.TYPE_ACCELEROMETER: 
       System.arraycopy(event.values, 0, mAccelValues, 0, 3); 
       break; 

      case Sensor.TYPE_MAGNETIC_FIELD: 
       System.arraycopy(event.values, 0, mMagnetValues, 0, 3); 
       break; 
     } 
     SensorManager.getRotationMatrix(mRotationMatrix, null, mAccelValues, mMagnetValues); 
     SensorManager.getOrientation(mRotationMatrix, mOrientationValues); 
     if (!isCurrentPositionSet) { 
      mCurrentPosition = mOrientationValues[1]; 
      count += 1; 
      if(count == 2) { 
       isCurrentPositionSet = true; 
      } 
     } 
     if(mCurrentPosition + 0.25 < mOrientationValues[1]) { 
      //Scroll to Top 
      mListener.onTiltUp(); 
     } 
     else if (mCurrentPosition - 0.25 > mOrientationValues[1]) { 
      //Scroll to Bottom 
      mListener.onTiltDown(); 
     } 
    }; 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) {} 

    public void requestAllSensors() { 
     mSensorManager.registerListener(this, mAccelSensor, SensorManager.SENSOR_DELAY_NORMAL); 
     mSensorManager.registerListener(this, mMagnetSensor, SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    public void killAllSensors() { 
     mSensorManager.unregisterListener(this, mAccelSensor); 
     mSensorManager.unregisterListener(this, mMagnetSensor); 
    } 

    public interface ScrollListener { 
     public void onTiltUp(); 
     public void onTiltDown(); 
    } 

} 

Ваша деятельность -

public class SensorActivity extends Activity { 

    private ScrollView mScrollView; 
    private TiltScrollController mTiltScrollController; 
    private SensorManager mSensorManager; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mScrollView = (ScrollView)findViewById(R.id.scroll); 
     mSensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE); 
     mTiltScrollController = new TiltScrollController(mSensorManager, new TiltScrollListener()); 
    } 

    public void scrollTextUp() { 
     mScrollView.smoothScrollBy(0, 6); 
    } 

    public void scrollTextBottom() { 
     mScrollView.smoothScrollBy(0, -6); 
    } 


    @Override 
    protected void onPause() { 
     mTiltScrollController.killAllSensors(); 
     super.onPause(); 
    } 

    public class TiltScrollListener implements TiltScrollController.ScrollListener { 

     @Override 
     public void onTiltUp() { 
      scrollTextUp(); 
     } 

     @Override 
     public void onTiltDown() { 
      scrollTextBottom(); 
     } 
    } 

} 

Ура !!

+0

У меня была такая же проблема, поэтому я поместил TextView в LinearLayout в scrollview и использовал ваш код, однако он, похоже, не работает. Я в правильном направлении, если бы вы не могли сообщить мне xml-макет текста, который вы пытаетесь прокрутить? – Saty

Смежные вопросы