2015-10-18 3 views
1

Я хочу Вращатьimage часто (несколько раз в секунду) и дисплей. При подготовке к этому изображение должно быть масштабировано, чтобы соответствовать представлению.Каков наиболее эффективный способ поворота и отображения изображения в пользовательском интерфейсе Android?

Что я первым сделал, определял Drawable, загружал его в ImageView и вызывал setRotation(). Но это только supportet поскольку уровень API 11, а не 9.

<ImageView 
    android:id="@+id/image" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:adjustViewBounds="true" 
    android:scaleType="fitCenter" 
    android:src="@drawable/image" /> 

Это дает очень плохой Perfomance (как и ожидалось), но то, что является наиболее effcient/подходящий способ сделать это? Изображение содержит прозрачные области, если это важно. Должен ли я использовать аппаратное ускорение?

This ответ как-то связан с этой темой. Но в моем случае поворот должен выполняться несколько раз, а масштабирование должно выполняться только один раз.

Я застрял в этом месте после того, как долго работал над этим, и прошу помощи здесь. Прошу прокомментировать, если у вас возникнут дополнительные вопросы, я с радостью ответю им.

+0

Является ли это вращение постоянная анимация, или угол поворота управляется пользователем жестов, или ...? –

+0

Он управляется датчиком, поэтому он не является постоянным **. @kris –

ответ

1

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

Поскольку вы повернуть изображение Я также предположить, что ваш источник растровый является круговым изображением, как игла на циферблате и т.д.

  • Создать View подкласс. Я назову его SensorView. Вы сами будете рисовать рисунок, так что вам действительно не нужен ImageView.
  • Обратный вызов вашего датчика потребует ссылки на действие или есть способ запустить обновление в потоке пользовательского интерфейса.
  • Когда ваш датчик срабатывает, получите показания и установите его на вид.

    actviity.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         mSensorView.setReading(val); 
        } 
    }); 
    
  • SensorView будет иметь значение для чтения, в Bitmap для изображения, и Matrix для преобразования растрового изображения.

    public class SensorView extends View { 
    
        private float mReading; // I use float as an example; use whatever your sensor device supports 
        private Bitmap mBitmap; 
        private Matrix mMatrix; 
        private RectF mBitmapRect; 
        private RectF mViewRect; 
    
        public SensorView(Context context) { 
         this(context, null); 
        } 
    
        public SensorView(Context context, AttributeSet attrs) { 
         super(context, attrs); 
    
         // set up your Bitmap here; don't worry about scaling it yet 
         mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.sensor_bitmap); 
    
         mMatrix = new Matrix(); 
         mBitmapRect = new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); 
         mViewRect = new RectF(); 
        } 
    
        public void setReading(float reading) { 
         mReading = reading; 
         postInvalidate(); // refresh the display 
        } 
    
        @Override 
        public void onDraw(Canvas canvas) { 
    
         mViewRect.right = getWidth(); 
         mViewRect.bottom = getHeight(); 
         mMatrix.reset(); 
    
         // center and scale the image 
         mMatrix.setRectToRect(mBitmapRect, mViewRect, ScaleToFit.CENTER); 
    
         // do the rotation 
         float theta = ... // compute angle based on mReading 
         mMatrix.preRotate(theta, mBitmapRect.centerX(), mBitmapRect.centerY()); 
    
         // draw the bitmap with the matrix 
         canvas.drawBitmap(mBitmap, mMatrix, null); 
        } 
    } 
    

[отредактирован после небольшого тестирования]

+0

Хорошо, спасибо! Это кажется более простым, чем мое «решение», и убирает обработчика. Я проверю это скоро! –

+0

Дайте мне знать, если у вас возникнут проблемы. Я сам буду тестировать. –

+0

hey @felixd, у меня была небольшая опечатка ('Content'), и я ошибся в потоке, отличном от UI,' setReading() 'должен запускаться в потоке пользовательского интерфейса. См. Мой обновленный ответ. Если у вас возникли проблемы с его работой, обновите свой вопрос со всем своим новым кодом, и я посмотрю на него. –

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

  • Нет связанных вопросов^_^