您的位置:首页 > 其它

图片放大缩小并且文字与图片相对位置不变

2012-12-06 16:40 609 查看
package com.android.activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
private SurfaceHolder holder=null; //控制对象
Point point ;
Bitmap bitmap ;
Matrix matrix;
Matrix savedMatrix;
public MySurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
holder=getHolder();
holder.addCallback(this);
}
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.i);
bitmapWidth = bitmap.getWidth();
bitmapHeight = bitmap.getHeight();
matrix = new Matrix();
matrix.setTranslate(0f, 0f);
savedMatrix = new Matrix();
savedMatrix.setTranslate(0f, 0f);
holder=getHolder();
holder.addCallback(this);
}
float oldDistance,newDistance,oldAngle;

private final int DRAG = 1;
private final int ZOOM = 2;
private final int NONE = 3;
private int flag;
private final int flagCount = 5;
private int action = NONE;
Point startPoint = new Point();
Point currentPoint = new Point();
Point midPoint = new Point();
Point pointMid;
Paint paint = new Paint();
private Point bitmapLeftTop,bitmapRightBottom;
private float scale;
private float fontScale = 1;
private float fontTransX = 0;
private float fontTransY = 0;
float leftSide,topSide,fontX,fontY;
private float bitmapWidth,bitmapHeight;
Point textPoint;
private int screenWidth,screenHeight;

//判断手势
public boolean onTouchEvent(MotionEvent event)
{
switch(event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:           // 第一个手指touch
{
startPoint.x = event.getX();
startPoint.y = event.getY();
flag =flagCount - 3;
action = DRAG;
break;
}
case MotionEvent.ACTION_POINTER_DOWN:   // 第二个手指touch
{

oldDistance = getDistance(event);   // 计算第二个手指touch时,两指之间的距离
if(oldDistance>10f){
action = ZOOM;
savedMatrix.set(matrix);
midPoint = pointMid(event);
}
break;
}
case MotionEvent.ACTION_UP:
{
action = NONE;
break;
}
case MotionEvent.ACTION_POINTER_UP:
{
System.out.println("ACTION_POINTER_UP");
flag = 0;
action = DRAG;
break;
}
case MotionEvent.ACTION_MOVE:
{
System.out.println("move");
if(action == DRAG){
onDrag(event);
}
flag++;
if(action == ZOOM){
onZoom(event);
}
}
}
return true;
}
//拖动函数
public void onDrag(MotionEvent event){

matrix.set(savedMatrix);
currentPoint.setXY(event.getX(), event.getY());

if(flag > flagCount){
matrix.postTranslate((float)(currentPoint.x-startPoint.x), (float)(currentPoint.y-startPoint.y));
//累计的移动量
fontTransX += (currentPoint.x-startPoint.x);
fontTransY+=(currentPoint.y-startPoint.y);
//当前textPoint的值
textPoint.setXY(textPoint.x+currentPoint.x-startPoint.x, textPoint.y+currentPoint.y-startPoint.y);

}
Canvas c=holder.lockCanvas();
c.drawColor(Color.WHITE);
c.drawBitmap(bitmap, matrix, paint);

paint.setTextSize(10*fontScale);
c.drawText("hello", textPoint.x, textPoint.y, paint);

holder.unlockCanvasAndPost(c);
startPoint.setPoint(currentPoint);
savedMatrix.set(matrix);

}

//缩放函数
public void onZoom(MotionEvent event){

newDistance = getDistance(event);   // 计算第二个手指touch时,两指之间的距离
if(newDistance>10f){
matrix.set(savedMatrix);
scale = (oldDistance+((newDistance-oldDistance)/2)) / oldDistance;
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
fontScale *=scale;
//缩放的中心点和textPoint的距离,在一次缩放过程中保持不变
float distance = getXYDistance(midPoint, textPoint);
float sina = (textPoint.y-midPoint.y)/distance;
float cosa = (textPoint.x-midPoint.x)/distance;
distance*=scale;
textPoint.x = distance*cosa+midPoint.x;
textPoint.y = distance*sina+midPoint.y;
oldDistance = newDistance;
Canvas c=holder.lockCanvas();
paint.setTextSize(10*fontScale);
c.drawColor(Color.WHITE);
c.drawBitmap(bitmap, matrix, paint);
c.drawText("hello", textPoint.x, textPoint.y, paint);
holder.unlockCanvasAndPost(c);
savedMatrix.set(matrix);

/* float[] matrixValues = new float[9];

matrix.getValues(matrixValues);

oldDistance = newDistance;
Canvas c=holder.lockCanvas();
c.drawColor(Color.WHITE);

fontScale *=scale;

//左边界和上边界
leftSide = midPoint.x-fontScale*(midPoint.x - matrixValues[2]);
topSide = midPoint.y-fontScale*(midPoint.y - matrixValues[5]);

bitmapHeight*=fontScale;
bitmapWidth*=fontScale;

System.out.println("fontTransX"+fontTransX);

paint.setTextSize(20*fontScale);

//c.drawText("hello", 100, 100, paint);
c.drawBitmap(bitmap, matrix, paint);

float fontX = leftSide+bitmapWidth/3f;
float fontY = topSide+bitmapHeight/3f;

System.out.println("fontX"+fontX+":::"+fontY);
c.drawText("hello", fontX, fontY, paint);
holder.unlockCanvasAndPost(c);
savedMatrix.set(matrix);*/
}
}
public void onNone(MotionEvent event){
System.out.println("NONE");
}

private float getDistance(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 Point pointMid(MotionEvent event)
{
pointMid = new Point();
pointMid.x = event.getX(0) + event.getX(1);
pointMid.y = event.getY(0) + event.getY(1);
pointMid.setXY(pointMid.x /2f, pointMid.y /2f);
return pointMid;
}
/* private float getDegree(MotionEvent event)
{
return (float)(Math.atan((event.getY(1) - event.getY(0)) / (event.getX(1) - event.getX(0))) * 180f);
}  	*/
// 创建新的图片
//Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,width, height, matrix, true);

public float getXYDistance(Point p1,Point p2){
float x = (p1.x-p2.x)*(p1.x-p2.x);

float y = (p1.y-p2.y)*(p1.y-p2.y);
return (float) Math.sqrt(x+y);
}
//接口函数实现
@Override
public void surfaceCreated(SurfaceHolder holder) {
new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}

//初始化线程
@Override
public void run() {
//获得屏幕参数

/*	WindowManager windowManager = new Activity().getWindowManager();
Display display = windowManager.getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();*/
bitmapLeftTop = new Point(150f,150f);
textPoint = new Point(100+bitmapWidth/3f,100+bitmapHeight/3f);
matrix.setTranslate(bitmapLeftTop.x, bitmapLeftTop.y);
savedMatrix.set(matrix);
Canvas c=holder.lockCanvas();
c.drawColor(Color.WHITE);
c.drawBitmap(bitmap, matrix, new Paint());

/*
float[] matrixValues = new float[9];

matrix.getValues(matrixValues);
for(int i=0;i<9;i++){
System.out.println(matrixValues[i]);
}
*/

c.drawText("hello", textPoint.x, textPoint.y, new Paint());
holder.unlockCanvasAndPost(c);
}
//点对象
class Point {
private float x;
private float y;
public Point() {
super();
}

public void setPoint(Point point){
this.x = point.x;
this.y = point.y;
}

public Point(float x, float y) {
super();
this.x = x;
this.y = y;
}

public void setXY(float xx,float yy){
x=xx;
y=yy;
}
public float getX() {
return x;
}

public void setX(float x) {
this.x = x;
}

public float getY() {
return y;
}

public void setY(float y) {
this.y = y;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐