2015-04-16 4 views
2

Я хочу реализовать Выравнивание, чтобы пользователь мог поворачивать изображение. Может ли кто-нибудь предоставить фрагмент кода или пример изображения? Я попытался найти пример, но потерпел неудачу.Выравнивание изображения в Android Пример

Заранее спасибо

+0

Это сообщение может сэкономить ваше время! http://stackoverflow.com/questions/18865837/image-straightening-in-android –

+1

спасибо за ответ @HarshDattani. я видел эту ссылку, но мне не удалось ее преобразовать в качестве образца – user512

+0

Если вы ищете образец, то, вероятно, это может вам помочь. http://android-er.blogspot.in/2010/07/rotate-bitmap-image-using-matrix.html –

ответ

3

enter image description here

Вот пример реализации:

HomeActivity.java

public class HomeActivity extends Activity implements SeekBar.OnSeekBarChangeListener { 

    private ImageView mImageView; 
    private Matrix mMatrix; 

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

     // load bitmap from resource 
     Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.sample2); 

     // calculate suitable width/height 
     int WIDTH = getWindowManager().getDefaultDisplay().getWidth(); 
     int HEIGHT = (int)((image.getHeight()/(image.getWidth() * 1.0f)) * WIDTH); 

     // scale image to be visible on screen 
     image = Bitmap.createScaledBitmap(image, WIDTH, HEIGHT, false); 

     // configure image view accordingly 
     mImageView = (ImageView) findViewById(R.id.imageView); 
     mImageView.setLayoutParams(new RelativeLayout.LayoutParams(WIDTH, HEIGHT)); 
     mImageView.setImageBitmap(image); 

     SeekBar seekbar = (SeekBar) findViewById(R.id.rotate_bar); 
     seekbar.setOnSeekBarChangeListener(this); 
    } 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     float angle = (progress - 45); 
     float width = mImageView.getDrawable().getIntrinsicWidth(); 
     float height = mImageView.getDrawable().getIntrinsicHeight(); 

     if (width > height) { 
      width = mImageView.getDrawable().getIntrinsicHeight(); 
      height = mImageView.getDrawable().getIntrinsicWidth(); 
     } 

     float a = (float) Math.atan(height/width); 

     // the length from the center to the corner of the green 
     float len1 = (width/2)/(float) Math.cos(a - Math.abs(Math.toRadians(angle))); 
     // the length from the center to the corner of the black 
     float len2 = (float) Math.sqrt(Math.pow(width/2,2) + Math.pow(height/2,2)); 
     // compute the scaling factor 
     float scale = len2/len1; 

     Matrix matrix = mImageView.getImageMatrix(); 
     if (mMatrix == null) { 
      mMatrix = new Matrix(matrix); 
     } 
     matrix = new Matrix(mMatrix); 

     float newX = (mImageView.getWidth()/2) * (1 - scale); 
     float newY = (mImageView.getHeight()/2) * (1 - scale); 
     matrix.postScale(scale, scale); 
     matrix.postTranslate(newX, newY); 
     matrix.postRotate(angle, mImageView.getWidth()/2, mImageView.getHeight()/2); 
     mImageView.setImageMatrix(matrix); 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { } 
} 

activity_home.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       tools:context=".HomeActivity"> 

    <ImageView 
     android:id="@+id/imageView" 
     android:scaleType="matrix" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent"/> 

    <SeekBar 
     android:id="@+id/rotate_bar" 
     android:max="90" 
     android:progress="45" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true"/> 

</RelativeLayout> 

Примечание: Вам нужно будет drawable Названный sample2 для приведенного выше кода для работы.

+0

спасибо, что он работает отлично ... – user512

+0

можно ли выпрямить 360 градусов? – user512

+0

Если вы хотите 360 градусов, вы должны пойти на вращение. Выравнивание обычно означает небольшое (увеличение + поворот вправо)/(масштабирование + поворот влево). Вышеприведенные уравнения для выпрямления не работают более чем на 90/-90 градусов. –

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