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 DisplayView extends View {
private Paint paint;
private Bitmap bitmap;
private PointF vTranslateCenter;
//记录手指移动时与按下时的偏移量
private PointF vTranslate;
//手指按下时的坐标
private PointF vStartTranslate;
//记录手指抬起时与按下时已经移动的偏移量(确保下次再次按下手指时继续从此偏移量进行偏移)
private PointF vTranslateBefore;
private float currentScale;
private int rectWidth;
private int rectHeight;
public DisplayView(Context context) {
this(context, null);
}
public DisplayView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, -1);
}
public DisplayView(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();
rectWidth = 400;
rectHeight = 300;
vTranslateCenter.set(-300,-100);
}
@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.drawColor(Color.BLACK);
canvas.translate(getWidth() / 2f, getHeight() / 2f);
drawAxis(canvas);
drawDot(canvas, Color.RED, 0f, 0f);
drawRect(canvas, Color.RED);
drawDot(canvas, Color.GREEN, vTranslateCenter.x, vTranslateCenter.y);
canvas.rotate(vTranslate.x / 5, vTranslateCenter.x, vTranslateCenter.y);
drawRect(canvas, Color.BLUE);
drawDot(canvas, Color.BLUE, 0f, 0f);
}
private void drawDot(Canvas canvas, int color, float x, float y) {
paint.setColor(color);
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(x, y, 5, paint);
}
private void drawRect(Canvas canvas, int color) {
paint.setStyle(Paint.Style.STROKE);
paint.setColor(color);
canvas.drawRect(
-rectWidth / 2f,
-rectHeight / 2f,
rectWidth / 2f,
rectHeight / 2f,
paint);
}
private void drawAxis(Canvas canvas) {
paint.setColor(Color.GREEN);
canvas.drawLine(-getWidth() / 2f, 0, getWidth() / 2f, 0, paint);
paint.setStrokeWidth(3);
canvas.drawLine(getWidth() / 2f - 15, -15, getWidth() / 2f, 0, paint);
canvas.drawLine(getWidth() / 2f - 15, 15, getWidth() / 2f, 0, paint);
paint.setStrokeWidth(1);
canvas.drawLine(0, -getHeight() / 2f, 0, getHeight() / 2f, paint);
paint.setStrokeWidth(3);
canvas.drawLine(-15, getHeight() / 2f - 15, 0, getHeight() / 2f, paint);
canvas.drawLine(15, getHeight() / 2f - 15, 0, getHeight() / 2f, paint);
paint.reset();
}
@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;
}
}
图片围绕某个点旋转演示模型
最新推荐文章于 2022-12-02 22:22:21 发布