当前位置: 源码素材网 » Android教程 » 详情页

Android 等比例缩放图片 旋转图片 获取屏幕像素

  •   时间:2019-03-25
  • 概述:图片放大 旋转图片

这个功能在Android图片处理方面十分常用 ,按比例放大图片,并且旋转图片,以及获取屏幕的宽度和高度等信息,以图片的控制部分是本代码的核心,请参考以下代码:

import java.util.HashMap;
import java.util.Set;
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.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback
{
	Sample12_4_Activity activity;
	Paint paint;
	Bitmap bitmapTmp; //图片
	float PicHeight;  //图片高度
	float PicWidth;   //图片宽度
	float currScale=0.8f;//初始缩放比例
	float angle=0;//初始旋转角度
	HashMap<Integer,BNPoint> hm=new HashMap<Integer,BNPoint>();
	float distance=0; //两个触控点之间的距离
	public MySurfaceView(Sample12_4_Activity activity)
	{
		super(activity);
		this.activity=activity;
		this.getHolder().addCallback(this);    //设置生命周期回调接口的实现者
		paint=new Paint();    //创建画笔
		paint.setAntiAlias(true);  //打开抗锯齿
		bitmapTmp=BitmapFactory.decodeResource(getResources(), R.drawable.bg);   //加载图片
		PicHeight=bitmapTmp.getHeight(); 	//图片的高度
		PicWidth=bitmapTmp.getWidth();  	//图片的宽度
	}
	public void onDraw(Canvas canvas)
	{
		paint.setColor(Color.BLACK);			 //设置画笔颜色
		canvas.drawRect(0, 0, 480, 854, paint);  //绘制黑色填充矩形
		float picWidthTemp=PicWidth*currScale;   //动态计算图片的高 宽
		float picHeightTemp=PicHeight*currScale;
		float left=(screenWidth-picWidthTemp)/2; //计算图片显示的坐标
		float top=(screenHeight-picHeightTemp)/2;
		Matrix m1=new Matrix();     //旋转图片 并绘制
		m1.setTranslate(left,top);   //动态改变图片位置
		Matrix m2=new Matrix();
		m2.setScale(currScale, currScale);
		Matrix mz=new Matrix();
		mz.setConcat(m1, m2);
		Matrix m3=new Matrix();
		m3.setRotate(angle, screenWidth/2, screenHeight/2);   //动态旋转图片
		Matrix mzz=new Matrix();
		mzz.setConcat(m3, mz);
		canvas.drawBitmap(bitmapTmp, mzz, paint);
	}
	@Override
	public boolean onTouchEvent(MotionEvent e)
	{
		//获取触控的动作编号
		int action=e.getAction()&MotionEvent.ACTION_MASK;
		//获取主、辅点id(down时主辅点id皆正确,up时辅点id正确,主点id要查询Map中剩下的一个点的id)
		int id=(e.getAction()&MotionEvent.ACTION_POINTER_ID_MASK)>>>MotionEvent.ACTION_POINTER_ID_SHIFT;
		switch(action)
		{
			case MotionEvent.ACTION_DOWN: //主点down
			case MotionEvent.ACTION_POINTER_DOWN: //辅点down
				//不论是主点还是辅点按下皆向Map中记录一个新点
                hm.put(id, new BNPoint(e.getX(id),e.getY(id)));
                //若已经有两个触控点按下,则计算距离
                if(hm.size()==2)
				{
					BNPoint bpTempA=hm.get(0);
					BNPoint bpTempB=hm.get(1);
					distance=BNPoint.calDistance(bpTempA, bpTempB);
				}
			break;
			case MotionEvent.ACTION_MOVE: //主/辅点move
				//不论主/辅点Move都更新其位置
				Set<Integer> ks=hm.keySet();
				for(int i:ks)
				{
					hm.get(i).setLocation(e.getX(i), e.getY(i));
				}
				//若当前有两个触控点按下则计算触控点距离并换算为缩放系数
				//同时计算旋转角度
				if(hm.size()==2)
				{
					BNPoint bpTempA=hm.get(0);
					BNPoint bpTempB=hm.get(1);
					//计算触控点距离并换算为缩放系数
					float currDis=BNPoint.calDistance(bpTempA, bpTempB);
					currScale=currScale+(currDis-distance)/200;
					if(currScale>2||currScale<0.5)
					{
						currScale=currScale-(currDis-distance)/200;
					}
					distance=currDis;
					//计算旋转角度
					if(bpTempA.hasOld||bpTempB.hasOld)
					{
						double alphaOld= Math.atan2((bpTempA.oldY- bpTempB.oldY), (bpTempA.oldX- bpTempB.oldX));
						double alphaNew= Math.atan2((bpTempA.y- bpTempB.y), (bpTempA.x- bpTempB.x));
						angle=angle+(float)Math.toDegrees(alphaNew-alphaOld);
					}
					//重绘画面
					this.repaint();
				}
			break;
			case MotionEvent.ACTION_UP: //主点up
				//在本应用中主点UP则只需要清空Map即可,在其他一些应用中需要操作的
				//则取出Map中唯一剩下的点操作即可
				hm.clear();
			break;
			case MotionEvent.ACTION_POINTER_UP: //辅点up
				//从Map中删除对应id的辅点
				hm.remove(id);
			break;
		}
		return true;
	}
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height)
	{
		this.repaint();
	}
	@Override
	public void surfaceCreated(SurfaceHolder holder)
	{
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder)
	{
	}
	public void repaint()  //重新绘制界面方法
	{
		SurfaceHolder holder=this.getHolder();
		Canvas canvas=holder.lockCanvas();
		try
		{
			synchronized(holder)
			{
				onDraw(canvas);//绘制
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(canvas != null)
			{
				holder.unlockCanvasAndPost(canvas);
			}
		}
	}
}

以下是相关的设置为全屏,获取屏幕宽度等信息:

public class Sample12_4_Activity extends Activity
{
	static float screenHeight;
	static float screenWidth;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE); //设置为全屏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,
	              WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        DisplayMetrics dm=new DisplayMetrics(); //获取屏幕宽度高度
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        screenHeight=dm.heightPixels;
        screenWidth=dm.widthPixels;
        MySurfaceView mySurfaceView=new MySurfaceView(this);
        this.setContentView(mySurfaceView);
    }
}

    相关声明:

      若“Android 等比例缩放图片 旋转图片 获取屏幕像素”有损您的权益,请告之我们删除内容。
      部分文章来源于网络,版权归原作者所有。