android bitmap 自适应,android怎样使自定义的view里的bitmap图片居中

满意答案

dcebd7a0de6265b6ccae5ead692f1eab.png

fiys7812

2016.01.05

dcebd7a0de6265b6ccae5ead692f1eab.png

采纳率:41%    等级:12

已帮助:16644人

几个重要知识点:

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

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

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

示例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] 

{

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 

{

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

}else if (rect.top > 0)

{

deltaY = -rect.top;

}else if (rect.bottom 

{

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

}

}

if (horizontal)

{

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

int screenWidth = 400;

if (width 

{

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

}else if (rect.left > 0)

{

deltaX = -rect.left;

}else if (rect.right 

{

deltaX = screenWidth - rect.right;

}

}

matrix.postTranslate(deltaX, deltaY);

}

}

[html] view plaincopy

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

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

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">

00分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值