自定义圆形图片,拖动、多点触控缩放,不超出边界
来源:互联网 发布:国家数据恢复中心费用 编辑:程序博客网 时间:2024/04/19 01:27
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class MyView extends View{
private float XR = 400;
private float YR = 400;
private float R = 100;
private int width;
private int height;
private final float increment = 10;
private final float min = 50;
private final float sensitivity = 5;
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getWidth();
height = getHeight();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(XR, YR, R, paint);
}
private float distance;
@Override
public boolean onTouchEvent(MotionEvent event) {
int pointer = event.getPointerCount();
float x = event.getX();
float y = event.getY();
int k = event.getAction();
if(k == MotionEvent.ACTION_POINTER_DOWN){
distance = getDistance(event);
}
if(pointer==1){
if(k == MotionEvent.ACTION_UP||k == MotionEvent.ACTION_MOVE){
if(x>width-R){
XR = width - R;
}else if(x<R){
XR = R;
}else{
XR = x;
}
if(y>height-R){
YR = height - R;
}else if(y<R){
YR = R;
}else{
YR = y;
}
postInvalidate();
}
}else if(pointer==2&&k == MotionEvent.ACTION_MOVE){
float maxR = 0;
if(XR<YR){
maxR = XR;
}else{
maxR = YR;
}
//判断手指方向
if(distance>getDistance(event)){
R -= increment;
if(R<min){
R = min;
}
}else if(distance<getDistance(event)){
R += increment;
if(R>maxR){
R = maxR;
}else if(R>width/2){
R = width/2;
}
}
distance = getDistance(event);
postInvalidate();
}
return true;
private float getDistance(MotionEvent event){
float xOne = event.getX(0);
float yOne = event.getY(0);
float xTwo = event.getX(1);
float yTwo = event.getY(1);
return (xOne - xTwo)*(xOne - xTwo)+(yOne - yTwo)*(yOne - yTwo);
}
}
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class MyView extends View{
private float XR = 400;
private float YR = 400;
private float R = 100;
private int width;
private int height;
private final float increment = 10;
private final float min = 50;
private final float sensitivity = 5;
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getWidth();
height = getHeight();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(XR, YR, R, paint);
}
private float distance;
@Override
public boolean onTouchEvent(MotionEvent event) {
int pointer = event.getPointerCount();
float x = event.getX();
float y = event.getY();
int k = event.getAction();
if(k == MotionEvent.ACTION_POINTER_DOWN){
distance = getDistance(event);
}
if(pointer==1){
if(k == MotionEvent.ACTION_UP||k == MotionEvent.ACTION_MOVE){
if(x>width-R){
XR = width - R;
}else if(x<R){
XR = R;
}else{
XR = x;
}
if(y>height-R){
YR = height - R;
}else if(y<R){
YR = R;
}else{
YR = y;
}
postInvalidate();
}
}else if(pointer==2&&k == MotionEvent.ACTION_MOVE){
float maxR = 0;
if(XR<YR){
maxR = XR;
}else{
maxR = YR;
}
//判断手指方向
if(distance>getDistance(event)){
R -= increment;
if(R<min){
R = min;
}
}else if(distance<getDistance(event)){
R += increment;
if(R>maxR){
R = maxR;
}else if(R>width/2){
R = width/2;
}
}
distance = getDistance(event);
postInvalidate();
}
return true;
}
//计算两点间距离
private float getDistance(MotionEvent event){
float xOne = event.getX(0);
float yOne = event.getY(0);
float xTwo = event.getX(1);
float yTwo = event.getY(1);
return (xOne - xTwo)*(xOne - xTwo)+(yOne - yTwo)*(yOne - yTwo);
}
}
0 0
- 自定义圆形图片,拖动、多点触控缩放,不超出边界
- 自定义圆形图片实现多点触控放大缩小和拖动
- 自定义圆形图片实现多点触控放大缩小和拖动
- 自定义圆形图片实现多点触控放大缩小和拖动
- 自定义的ImageView控制,可对图片进行多点触控缩放和拖动
- 自定义ImageView实现图片的拖动、缩放和边界回弹
- 自定义类继承ImageView 实现多点图片触碰的拖动和缩放
- 自定义类继承ImageView 实现多点图片触碰的拖动和缩放
- Android-------自定义圆形图片实现多点触控
- Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控旋转,圆角矩形,圆形和仿刮刮卡效果
- Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控缩放
- Android自定义imageview可对图片进行多点缩放和拖动
- 多点触控(缩放图片)
- 多点触控 实现图片自由缩放
- 实现多点触控图片缩放
- Android-图片预览(自定义ImageView实现图片缩放,多点触控,自由移动)
- android自定义控件实现太极图,拖动,缩放不超过边界
- 让Android自带的Gallery实现多点缩放,拖动和边界回弹效果,效果流畅
- rac taf配置
- 八、服务详解
- 关于linux克隆,网络配置问题
- JavaScript HTML DOM
- Javascript面向对象(五)——内置原型
- 自定义圆形图片,拖动、多点触控缩放,不超出边界
- 方差分析
- Android Studio Gradle环境变量配置
- ORB特征点
- 变形最短路 SCU 4444 training 3
- LINUX HTB队列规定用户指南
- 1014. 福尔摩斯的约会
- the diary of sleep jobs & fg command line in linux
- 海量数据处理面试题