展会信息港展会大全

Android:ImageView图片缩放、居中
来源:互联网   发布日期:2015-10-03 11:22:07   浏览:2266次  

导读:几个重要知识点:1、布局文件中android:scaleType="matrix" 设置图片动态缩放2、matrix.postTranslate(dx,dy); 平移图片 matrix.p...

几个重要知识点:

1、布局文件中android:scaleType="matrix" 设置图片动态缩放

2、matrix.postTranslate(dx,dy); 平移图片 matrix.postScale(sx,sy,p.x,p.y); 缩放图片

3、两点的中点、距离计算方式,限制缩放范围函数,在指定区域内移动图片方法

(以下代码网上很多地方有类似的,仅供参考)

[java]

public class Main extends Activity

{

private static final int NONE = 0;

private static final int DRAG = 1;

private static final int ZOOM = 2;

private int mode = NONE;

private float oldDist;

private Matrix matrix = new Matrix();

private Matrix savedMatrix = new Matrix();

private PointF start = new PointF();

private PointF mid = new PointF();

ImageView view;

Bitmap bitmap;

DisplayMetrics dm;

float minScaleR=0.1f;//最少缩放比例

static final float MAX_SCALE = 4f; //最大缩放比例

float dist = 1f;

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

view = (ImageView) findViewById(R.id.image_view);

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);

dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm); //获取分辨率

matrix.setScale(minScaleR, minScaleR); //开始先缩小

matrix.postTranslate(120, 120);//图片的位置相对于imageview的左上角往右往下各偏移120个像素

view.setImageMatrix(matrix);

view.setOnTouchListener(new OnTouchListener()

{

@Override

public boolean onTouch(View v, MotionEvent event)

{

ImageView view = (ImageView) v;

switch (event.getAction() & MotionEvent.ACTION_MASK)

{

case MotionEvent.ACTION_DOWN://单点

Toast.makeText(Main.this, bitmap.getWidth()+"*"+bitmap.getHeight(), Toast.LENGTH_LONG).show();

savedMatrix.set(matrix);

start.set(event.getX(), event.getY());

mode = DRAG;

break;

case MotionEvent.ACTION_UP://单点弹起

case MotionEvent.ACTION_POINTER_UP://多点弹起

mode = NONE;

break;

case MotionEvent.ACTION_POINTER_DOWN://多点

oldDist = spacing(event);

if (oldDist > 10f)

{

savedMatrix.set(matrix);

midPoint(mid, event);

mode = ZOOM;

}

break;

case MotionEvent.ACTION_MOVE: //按下且在拖动

if (mode == DRAG)

{

matrix.set(savedMatrix);

matrix.postTranslate(event.getX() - start.x,event.getY() - start.y);//xy方向都可以拖动

//matrix.postTranslate(event.getX() - start.x,0); //只在x轴方向拖动 即左右拖动上下不动

//matrix.postTranslate(0,event.getY() - start.y);//只在y轴方向拖动 即上下拖动左右不动

}

else if (mode == ZOOM)

{

float newDist = spacing(event);

if (newDist > 10f)

{

matrix.set(savedMatrix);

float scale = newDist / oldDist;

matrix.postScale(scale, scale, mid.x, mid.y);

}

}

break;

}

view.setImageMatrix(matrix);

CheckScale();//限制缩放范围

center();//居中控制

return true;

}

//两点的距离

private float spacing(MotionEvent event)

{

float x = event.getX(0) - event.getX(1);

float y = event.getY(0) - event.getY(1);

return FloatMath.sqrt(x * x + y * y);

}

//两点的中点

private void midPoint(PointF point, MotionEvent event)

{

float x = event.getX(0) + event.getX(1);

float y = event.getY(0) + event.getY(1);

point.set(x / 2, y / 2);

}

});

}

//限制最大最小缩放比例

protected void CheckScale()

{

float p[] = new float[9];

matrix.getValues(p);

if (mode == ZOOM)

{

if (p[0] < minScaleR)

{

matrix.setScale(minScaleR, minScaleR);

}

if (p[0] > MAX_SCALE)

{

matrix.set(savedMatrix);

}

}

}

//自动居中左右及上下都居中

protected void center()

{

center(true,true);

}

private void center(boolean horizontal, boolean vertical)

{

Matrix m = new Matrix();

m.set(matrix);

RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());

m.mapRect(rect);

float height = rect.height();

float width = rect.width();

float deltaX = 0, deltaY = 0;

if (vertical)

{

//int screenHeight = dm.heightPixels;//手机屏幕分辨率的高度

int screenHeight = 400;

if (height < screenHeight)

{

deltaY = (screenHeight - height)/2 - rect.top;

}else if (rect.top > 0)

{

deltaY = -rect.top;

}else if (rect.bottom < screenHeight)

{

deltaY = view.getHeight() - rect.bottom;

}

}

if (horizontal)

{

//int screenWidth = dm.widthPixels;//手机屏幕分辨率的宽度

int screenWidth = 400;

if (width < screenWidth)

{

deltaX = (screenWidth - width)/2 - rect.left;

}else if (rect.left > 0)

{

deltaX = -rect.left;

}else if (rect.right < screenWidth)

{

deltaX = screenWidth - rect.right;

}

}

matrix.postTranslate(deltaX, deltaY);

}

}

public class Main extends Activity

{

private static final int NONE = 0;

private static final int DRAG = 1;

private static final int ZOOM = 2;

private int mode = NONE;

private float oldDist;

private Matrix matrix = new Matrix();

private Matrix savedMatrix = new Matrix();

private PointF start = new PointF();

private PointF mid = new PointF();

ImageView view;

Bitmap bitmap;

DisplayMetrics dm;

float minScaleR=0.1f;//最少缩放比例

static final float MAX_SCALE = 4f; //最大缩放比例

float dist = 1f;

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

view = (ImageView) findViewById(R.id.image_view);

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);

dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm); //获取分辨率

matrix.setScale(minScaleR, minScaleR); //开始先缩小

matrix.postTranslate(120, 120);//图片的位置相对于imageview的左上角往右往下各偏移120个像素

view.setImageMatrix(matrix);

view.setOnTouchListener(new OnTouchListener()

{

@Override

public boolean onTouch(View v, MotionEvent event)

{

ImageView view = (ImageView) v;

switch (event.getAction() & MotionEvent.ACTION_MASK)

{

case MotionEvent.ACTION_DOWN://单点

Toast.makeText(Main.this, bitmap.getWidth()+"*"+bitmap.getHeight(), Toast.LENGTH_LONG).show();

savedMatrix.set(matrix);

start.set(event.getX(), event.getY());

mode = DRAG;

break;

case MotionEvent.ACTION_UP://单点弹起

case MotionEvent.ACTION_POINTER_UP://多点弹起

mode = NONE;

break;

case MotionEvent.ACTION_POINTER_DOWN://多点

oldDist = spacing(event);

if (oldDist > 10f)

{

savedMatrix.set(matrix);

midPoint(mid, event);

mode = ZOOM;

}

break;

case MotionEvent.ACTION_MOVE: //按下且在拖动

if (mode == DRAG)

{

matrix.set(savedMatrix);

matrix.postTranslate(event.getX() - start.x,event.getY() - start.y);//xy方向都可以拖动

//matrix.postTranslate(event.getX() - start.x,0); //只在x轴方向拖动 即左右拖动上下不动

//matrix.postTranslate(0,event.getY() - start.y);//只在y轴方向拖动 即上下拖动左右不动

}

else if (mode == ZOOM)

{

float newDist = spacing(event);

if (newDist > 10f)

{

matrix.set(savedMatrix);

float scale = newDist / oldDist;

matrix.postScale(scale, scale, mid.x, mid.y);

}

}

break;

}

view.setImageMatrix(matrix);

CheckScale();//限制缩放范围

center();//居中控制

return true;

}

//两点的距离

private float spacing(MotionEvent event)

{

float x = event.getX(0) - event.getX(1);

float y = event.getY(0) - event.getY(1);

return FloatMath.sqrt(x * x + y * y);

}

//两点的中点

private void midPoint(PointF point, MotionEvent event)

{

float x = event.getX(0) + event.getX(1);

float y = event.getY(0) + event.getY(1);

point.set(x / 2, y / 2);

}

});

}

//限制最大最小缩放比例

protected void CheckScale()

{

float p[] = new float[9];

matrix.getValues(p);

if (mode == ZOOM)

{

if (p[0] < minScaleR)

{

matrix.setScale(minScaleR, minScaleR);

}

if (p[0] > MAX_SCALE)

{

matrix.set(savedMatrix);

}

}

}

//自动居中左右及上下都居中

protected void center()

{

center(true,true);

}

private void center(boolean horizontal, boolean vertical)

{

Matrix m = new Matrix();

m.set(matrix);

RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());

m.mapRect(rect);

float height = rect.height();

float width = rect.width();

float deltaX = 0, deltaY = 0;

if (vertical)

{

//int screenHeight = dm.heightPixels;//手机屏幕分辨率的高度

int screenHeight = 400;

if (height < screenHeight)

{

deltaY = (screenHeight - height)/2 - rect.top;

}else if (rect.top > 0)

{

deltaY = -rect.top;

}else if (rect.bottom < screenHeight)

{

deltaY = view.getHeight() - rect.bottom;

}

}

if (horizontal)

{

//int screenWidth = dm.widthPixels;//手机屏幕分辨率的宽度

int screenWidth = 400;

if (width < screenWidth)

{

deltaX = (screenWidth - width)/2 - rect.left;

}else if (rect.left > 0)

{

deltaX = -rect.left;

}else if (rect.right < screenWidth)

{

deltaX = screenWidth - rect.right;

}

}

matrix.postTranslate(deltaX, deltaY);

}

}[html]

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<ImageView

android:layout_width="200dip"

android:layout_height="200dip"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:scaleType="matrix"

android:src="@drawable/test"

android:id="@+id/image_view">

</ImageView>

</RelativeLayout>

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<ImageView

android:layout_width="200dip"

android:layout_height="200dip"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:scaleType="matrix"

android:src="@drawable/test"

android:id="@+id/image_view">

</ImageView>

</RelativeLayout>

赞助本站

人工智能实验室

相关热词: android开发 教程

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港