package com.hfengxiang.example.myphotoview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.Nullable;
public class SingleMoveView extends View {
private Paint paint;
private Bitmap bitmap;
private PointF vTranslateCenter;
//记录手指移动时与按下时的偏移量
private PointF vTranslate;
//手指按下时的坐标
private PointF vStartTranslate;
//记录手指抬起时与按下时已经移动的偏移量(确保下次再次按下手指时继续从此偏移量进行偏移)
private PointF vTranslateBefore;
private RectF dest;
private float currentScale;
public SingleMoveView(Context context) {
this(context, null);
}
public SingleMoveView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, -1);
}
public SingleMoveView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
paint = new Paint();
paint.setAntiAlias(true);
bitmap = Utils.getPhoto(getResources(), getResources().getDisplayMetrics().widthPixels);
vTranslateCenter = new PointF();
vTranslate = new PointF();
vStartTranslate = new PointF();
vTranslateBefore = new PointF();
dest = new RectF();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
currentScale = bitmap.getWidth()* 1f/getWidth() ;
Log.v("SingleMoveView","currentScale="+currentScale);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.translate(getWidth() / 2f, getHeight() / 2f);
dest.set(-bitmap.getWidth()*currentScale / 2, -bitmap.getHeight()*currentScale / 2, bitmap.getWidth()*currentScale/ 2, bitmap.getHeight()*currentScale/ 2);
//先旋转后平移会导致坐标轴旋转
// canvas.rotate(90);
canvas.translate(vTranslate.x, vTranslate.y);
canvas.rotate(90);
canvas.drawBitmap(bitmap, null, dest, paint);
paint.setColor(Color.RED);
canvas.drawCircle(0,0,5,paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float x = event.getX();
float y = event.getY();
vStartTranslate.set(x,y);
break;
case MotionEvent.ACTION_MOVE:
vTranslate.set(event.getX()-vStartTranslate.x+vTranslateBefore.x,
event.getY()-vStartTranslate.y+vTranslateBefore.y);
Log.v("SingleMoveView","x:"+vTranslate.x+",y:"+vTranslate.y);
Log.d("SingleMoveView","event.getX():"+event.getX()+",event.getY():"+event.getY());
invalidate();
break;
case MotionEvent.ACTION_UP:
vTranslateBefore.set(vTranslate);
break;
}
return true;
}
}
10-24
573