package com.roboo.like.netease;
import roboguice.inject.InjectView;
import android.graphics.Matrix;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import com.roboo.like.netease.view.MatrixImageView;
public class MatrixActivity extends BaseRoboActivity implements OnTouchListener
{
@InjectView(R.id.miv_image)
MatrixImageView mImageView;
private Matrix mMatrix;
private static int mMode = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setTVTitle(R.string.tv_matrix);
// TODO setContentView Tag
setContentView(R.layout.activity_matrix);
this.mImageView.setOnTouchListener(this);
}
private void setMode(int mode)
{
switch (mode)
{
case 0:
translate();
break;
case 1:
rotateRoundCenter();
break;
case 2:
rotateAndTranslate();
break;
case 3:
scale();
break;
case 4:
skewHorizonal();
break;
case 5:
skewVertical();
break;
case 6:
skewHorizonalAndVertical();
break;
case 7:
symmetrical();
break;
case 8:
symmetricalVertical();
break;
case 9:
symmetricalXY();
break;
default:
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.activity_matrix, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.action_translate:
mMode = 0;
break;
case R.id.action_rotate_round_center:
mMode = 1;
break;
case R.id.action_rotate_round_horizontal:
mMode = 2;
break;
case R.id.action_scale:
mMode = 3;
break;
case R.id.action_skew_horizontal:
mMode = 4;
break;
case R.id.action_skew_vertical:
mMode = 5;
break;
case R.id.action_skew_horizontal_vertical:
mMode = 6;
break;
case R.id.action_symmetrical_horizontal:
mMode = 7;
break;
case R.id.action_symmetrical_vertical:
mMode = 8;
break;
case R.id.action_symmetrical_x_y:
mMode = 9;
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onTouch(View v, MotionEvent e)
{
if (e.getAction() == MotionEvent.ACTION_UP)
{
this.mMatrix = new Matrix();
setMode(mMode);
mImageView.invalidate();
}
return true;
}
/**
* TODO 对称(对称轴为直线y = x)
*
*/
private void symmetricalXY()
{
float matrix_values[] = { 0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f };
mMatrix.setValues(matrix_values);
seeMatrix();
// 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠
mMatrix.postTranslate(mImageView.getImageBitmap().getHeight() +
mImageView.getImageBitmap().getWidth(),
mImageView.getImageBitmap().getHeight() +
mImageView.getImageBitmap().getWidth());
mImageView.setImageMatrix(mMatrix);
seeMatrix();
}
/**
* TODO 对称 - 垂直
*
*/
private void symmetricalVertical()
{
float matrix_values[] = { -1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f };
mMatrix.setValues(matrix_values);
seeMatrix();
// 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠
mMatrix.postTranslate(mImageView.getImageBitmap().getWidth() * 2f, 0f);
mImageView.setImageMatrix(mMatrix);
seeMatrix();
}
/**
* TODO 对称 (水平对称)
*
*/
private void symmetrical()
{
float matrix_values[] = { 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f };
mMatrix.setValues(matrix_values);
seeMatrix();
// 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠
mMatrix.postTranslate(0f, mImageView.getImageBitmap().getHeight() * 2f);
mImageView.setImageMatrix(mMatrix);
seeMatrix();
}
/**
* TODO 错切 - 水平 + 垂直
*
*/
private void skewHorizonalAndVertical()
{
mMatrix.setSkew(0.5f, 0.5f);
seeMatrix();
// 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠
mMatrix.postTranslate(0f, mImageView.getImageBitmap().getHeight());
mImageView.setImageMatrix(mMatrix);
seeMatrix();
}
/**
* TODO 错切 - 垂直
*
*/
private void skewVertical()
{
mMatrix.setSkew(0f, 0.5f);
seeMatrix();
// 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠
mMatrix.postTranslate(0f, mImageView.getImageBitmap().getHeight());
mImageView.setImageMatrix(mMatrix);
seeMatrix();
}
/**
* TODO 错切 - 水平
*
*/
private void skewHorizonal()
{
mMatrix.setSkew(0.5f, 0f);
seeMatrix();
// 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠
mMatrix.postTranslate(mImageView.getImageBitmap().getWidth(), 0f);
mImageView.setImageMatrix(mMatrix);
seeMatrix();
}
/**
* TODO 缩放
*
*/
private void scale()
{
mMatrix.setScale(2f, 2f);
seeMatrix();
// 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠
mMatrix.postTranslate(mImageView.getImageBitmap().getWidth(),
mImageView.getImageBitmap().getHeight());
mImageView.setImageMatrix(mMatrix);
seeMatrix();
}
/**
* TODO 旋转(围绕坐标原点) + 平移(效果同2)
*
*/
private void rotateAndTranslate()
{
mMatrix.setRotate(45f);
mMatrix.preTranslate(-1f * mImageView.getImageBitmap().getWidth() / 2f,
-1f * mImageView.getImageBitmap().getHeight() / 2f);
mMatrix.postTranslate((float) mImageView.getImageBitmap().getWidth() /
2f, (float) mImageView.getImageBitmap().getHeight() / 2f);
// 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠
mMatrix.postTranslate((float) mImageView.getImageBitmap().getWidth() *
1.5f, 0f);
mImageView.setImageMatrix(mMatrix);
seeMatrix();
}
/**
* TODO 旋转(围绕图像的中心点)
*
*/
private void rotateRoundCenter()
{
mMatrix.setRotate(45f, mImageView.getImageBitmap().getWidth() / 2f,
mImageView.getImageBitmap().getHeight() / 2f);
// 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠
mMatrix.postTranslate(mImageView.getImageBitmap().getWidth() * 1.5f,
0f);
mImageView.setImageMatrix(mMatrix);
seeMatrix();
}
/**
* TODO 平移
*
*/
private void translate()
{
// 输出图像的宽度和高度(240 x 240)
System.out.println("right = " + mImageView.getRight() + "");
mMatrix.postTranslate(mImageView.getImageBitmap().getWidth(), mImageView.getImageBitmap().getHeight());
// 在x方向平移view.getImageBitmap().getWidth(),在y轴方向view.getImageBitmap().getHeight()
mImageView.setImageMatrix(mMatrix);
seeMatrix();
}
private void seeMatrix()
{
// 下面的代码是为了查看matrix中的元素
float[] matrixValues = new float[9];
mMatrix.getValues(matrixValues);
for (int i = 0; i < 3; ++i)
{
String temp = new String();
for (int j = 0; j < 3; ++j)
{
temp += matrixValues[3 * i + j] + " \t ";
}
Log.e("TestTransformMatrixActivity", temp);
}
}
}