2015-08-26 3 views
2

У меня есть следующий код для поворота изображения, но когда я перетаскиваю seekBar, он создает новое растровое изображение на старом изображении (он должен вращать более старое изображение вместо создания нового), может ли кто-то помочь меня в сортировке этой вещи.? я посетил мои старые вопросы, но никто не решил это для меняПовернуть изображение с помощью seekBar в android

общественный класс MainActivity расширяет активность реализует OnSeekBarChangeListener {

ImageView iv_image; 
SeekBar seekbar; 
Bitmap source; 
float angle = 0; 
Button buttonClick; 
Bitmap rotatedImage; 
static Matrix matrix; 
Matrix m1 ; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    init(); 
    buttonClick = (Button) findViewById(R.id.bt); 
    buttonClick.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      angle += 90; 

      iv_image.buildDrawingCache(); 
      source = iv_image.getDrawingCache(); 
      rotatedImage = rotateImage(source, angle); 
      iv_image.setImageBitmap(rotatedImage); 
     } 
    }); 
} 

void init() { 
    iv_image = (ImageView) findViewById(R.id.iv_image); 
    seekbar = (SeekBar) findViewById(R.id.seekbar); 
    seekbar.setOnSeekBarChangeListener(this); 
    // seekbar.setOnSeekBarChangeListener((OnSeekBarChangeListener) this); 

} 

public void onProgressChanged(SeekBar seekBar, int progress, 
     boolean fromUser) { 
    // TODO Auto-generated method stub 

    angle = progress; 
    iv_image.buildDrawingCache(); 
    source = iv_image.getDrawingCache(); 
    rotatedImage = rotateImage(source, angle); 
    iv_image.setImageMatrix(null); 
    iv_image.setImageBitmap(rotatedImage); 
} 

public void onStartTrackingTouch(SeekBar seekBar) { 
    // TODO Auto-generated method stub 

} 

public void onStopTrackingTouch(SeekBar seekBar) { 
    // TODO Auto-generated method stub 

} 

public static Bitmap rotateImage(Bitmap sourceImage, float angle) { 
    matrix = new Matrix(); 
    matrix.postRotate(angle); 
    return Bitmap.createBitmap(sourceImage, 0, 0, sourceImage.getWidth(), 
      sourceImage.getHeight(), matrix, true); 

} 
+0

Я не думаю, что вы вывесили ваш код ... = P – Wildcopper

+0

Почему бы заменить всю битовую карту, когда вы можете просто обновить матрицу изображения с новым углом поворота? Это было бы намного эффективнее! – whitebrow

+0

введите код –

ответ

2

Попробуйте вместо этого:

public static void rotateImage(float angle) { 
    matrix = new Matrix(); 
    matrix.postRotate(angle); 
    imageView.setImageMatrix(matrix); 
    imageView.invalidate(); 
} 

Вот ваша реализация интерфейса:

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    angle = progress; 
    rotateImage(angle); 
} 

Этот способ y ou будет поворачивать растровое изображение внутри ImageView, что намного эффективнее.

Вы можете даже повторно использовать объект Matrix, сделав его частным членом и позвонив по телефону imageView.invalidate() после ротации, чтобы оптимизировать ваш код.

+0

это не вращает изображение –

+0

Возможно, вам нужно позвонить imageView.invalidate(); чтобы он работал. Я обновил этот пример. – whitebrow

+0

это не работает @whitebrow –

0
public static void rotateImage(float angle) { 
    matrix = new Matrix(); 
    matrix.postRotate(angle); 
    imageView.setScaleType(ImageView.ScaleType.MATRIX); 
    imageView.setImageMatrix(matrix); 
    imageView.invalidate(); 
} 
+0

Можете ли вы рассказать о том, как этот ответ решает проблему и как она улучшает существующий ответ? – ssube

+0

вы должны установить масштаб масштаба изображения Матрица imageView.setScaleType (ImageView.ScaleType.MATRIX); – Sarmad

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