android中实现自定义view中图形的缩放
16lz
2021-01-26
package com.example.drawview;
import java.util.Currency;
import android.content.Context;
import android.graphics.AvoidXfermode.Mode;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
/**
*
* 自定义view类,,实现自定义view
* @author 浅议爱
*
*/
public class MyView extends View{
//定义画笔
public Paint paint;
public float my_x=200;
public float my_y=200;
public int width;
public int height;
float my_ra = 50;//半径
public float mCurrentRate = 1;
public float mOldRate = 1;
public boolean mIsFirst;
public float mOriginalLength;
public float mCurrentLength;
public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
paint=new Paint();
}
public MyView(Context context, AttributeSet attrs) {
// super(context, attrs);
// TODO Auto-generated constructor stub
this(context, attrs, 0);
}
public MyView(Context context) {
// super(context);
this(context, null);
}
//定义画画方法
@Override
public void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
// canvas.drawText("我是武小鹏", 100,100, paint);
//画一个圆,第三个代表圆的半径
// canvas.drawCircle(cx, cy, radius, paint);
paint.setColor(Color.RED);
canvas.drawCircle(my_x, my_y, my_ra, paint);
// zoom(canvas);
// //画一条线
// canvas.drawLine(0.0f, 0.0f, 100.0f, 100.0f, paint);
// //自定义圆,扇形
// RectF rectF=new RectF(100, 30, 300, 100);
// canvas.drawArc(rectF, 0, 360, false, paint);
}
//定义触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
int count=event.getPointerCount();
switch (count) {
case 1:
//当手指移动的时候,,圆跟着手指移动,重新绘制圆
Log.i("TAG", "X坐标="+event.getRawX()+"Y坐标="+event.getRawY());
//获取点击的坐标
float ev_x=event.getX();
float ev_y=event.getY();
float x=ev_x-my_x;
float y=ev_y-my_y;
//判断是否在圆上点击,,,,
//如果是一,支持滑动
if (Math.sqrt(x*x+y*y)<=50) {
my_x=event.getX();
my_y=event.getY();
invalidate();//刷新
}
break;
case 2:
//计算两手之间的距离
float disX = Math.abs(event.getX(0) - event.getX(1));
float disY = Math.abs(event.getY(0) - event.getY(1));
//两手之间的距离就是圆的直径
double sqrt = Math.sqrt(disX * disX + disY * disY);
//计算圆的半径,重新刷新数据
my_ra=(float) sqrt/2;
invalidate();
break;
}
case MotionEvent.ACTION_UP:
mOldRate = mCurrentRate;
mIsFirst = true;
break;
}
return true;
}
//设置自定义布局的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//调用该方法。。设置自定义布局的宽和高
// setMeasuredDimension(400, 400);
}
//设置自定义布局的位置
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
// TODO Auto-generated method stub
super.onLayout(changed, left, top, right, bottom);
DisplayMetrics metrics = new DisplayMetrics();
//
// // 得到布局的宽和高
// int width = getMeasuredWidth();
// int height = getMeasuredHeight();
// metrics = getResources().getDisplayMetrics();
// int screenWidth = metrics.widthPixels; // 屏幕宽(像素,如:480px)
// int screenHeight = metrics.heightPixels; // 屏幕高(像素,如:800px)
// int x = (screenWidth - width) / 2;
// int y = (screenHeight - height) / 2;
// int z = screenHeight/2-(screenHeight/2-height/2);
// setX(x);
// setY(z);
}
}
import java.util.Currency;
import android.content.Context;
import android.graphics.AvoidXfermode.Mode;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
/**
*
* 自定义view类,,实现自定义view
* @author 浅议爱
*
*/
public class MyView extends View{
//定义画笔
public Paint paint;
public float my_x=200;
public float my_y=200;
public int width;
public int height;
float my_ra = 50;//半径
public float mCurrentRate = 1;
public float mOldRate = 1;
public boolean mIsFirst;
public float mOriginalLength;
public float mCurrentLength;
public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
paint=new Paint();
}
public MyView(Context context, AttributeSet attrs) {
// super(context, attrs);
// TODO Auto-generated constructor stub
this(context, attrs, 0);
}
public MyView(Context context) {
// super(context);
this(context, null);
}
//定义画画方法
@Override
public void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
// canvas.drawText("我是武小鹏", 100,100, paint);
//画一个圆,第三个代表圆的半径
// canvas.drawCircle(cx, cy, radius, paint);
paint.setColor(Color.RED);
canvas.drawCircle(my_x, my_y, my_ra, paint);
// zoom(canvas);
// //画一条线
// canvas.drawLine(0.0f, 0.0f, 100.0f, 100.0f, paint);
// //自定义圆,扇形
// RectF rectF=new RectF(100, 30, 300, 100);
// canvas.drawArc(rectF, 0, 360, false, paint);
}
//定义触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
int count=event.getPointerCount();
switch (count) {
case 1:
//当手指移动的时候,,圆跟着手指移动,重新绘制圆
Log.i("TAG", "X坐标="+event.getRawX()+"Y坐标="+event.getRawY());
//获取点击的坐标
float ev_x=event.getX();
float ev_y=event.getY();
float x=ev_x-my_x;
float y=ev_y-my_y;
//判断是否在圆上点击,,,,
//如果是一,支持滑动
if (Math.sqrt(x*x+y*y)<=50) {
my_x=event.getX();
my_y=event.getY();
invalidate();//刷新
}
break;
case 2:
//计算两手之间的距离
float disX = Math.abs(event.getX(0) - event.getX(1));
float disY = Math.abs(event.getY(0) - event.getY(1));
//两手之间的距离就是圆的直径
double sqrt = Math.sqrt(disX * disX + disY * disY);
//计算圆的半径,重新刷新数据
my_ra=(float) sqrt/2;
invalidate();
break;
}
case MotionEvent.ACTION_UP:
mOldRate = mCurrentRate;
mIsFirst = true;
break;
}
return true;
}
//设置自定义布局的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//调用该方法。。设置自定义布局的宽和高
// setMeasuredDimension(400, 400);
}
//设置自定义布局的位置
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
// TODO Auto-generated method stub
super.onLayout(changed, left, top, right, bottom);
DisplayMetrics metrics = new DisplayMetrics();
//
// // 得到布局的宽和高
// int width = getMeasuredWidth();
// int height = getMeasuredHeight();
// metrics = getResources().getDisplayMetrics();
// int screenWidth = metrics.widthPixels; // 屏幕宽(像素,如:480px)
// int screenHeight = metrics.heightPixels; // 屏幕高(像素,如:800px)
// int x = (screenWidth - width) / 2;
// int y = (screenHeight - height) / 2;
// int z = screenHeight/2-(screenHeight/2-height/2);
// setX(x);
// setY(z);
}
}
更多相关文章
- Android(安卓)动态设置布局文件的exception
- android WebView 使用实例
- 动态生成控件
- 实现RadioButton多行多列排列布局
- 多条柱状图图
- 定义界面布局TextView&Button
- Android(安卓)Studio用线性布局和相对布局做一个简单的登陆界面
- android wearOs开发
- Android布局 屏幕滚动方法 ScrollView