Java 矩形-更改运动事件的宽度和高度?
我需要根据动作移动从画布中心绘制矩形 我试过这样做Java 矩形-更改运动事件的宽度和高度?,java,android,android-view,Java,Android,Android View,我需要根据动作移动从画布中心绘制矩形 我试过这样做 public class CustomRectangle extends View { private Bitmap bitTopLeft; private Bitmap bitTopRight; private Bitmap bitBottomLeft; private Bitmap bitBottomRight; private Paint rectAnglePaint; private Context context; private
public class CustomRectangle extends View {
private Bitmap bitTopLeft;
private Bitmap bitTopRight;
private Bitmap bitBottomLeft;
private Bitmap bitBottomRight;
private Paint rectAnglePaint;
private Context context;
private Paint bitmapPaint;
private Rect rect;
private int maxX;
private int maxY;
private int centerX;
private int centerY;
private Paint canvasPaint;
public CustomRectangle(Context context) {
super(context);
this.context = context;
Init();
}
private void Init() {
bitTopLeft = BitmapFactory.decodeResource(context.getResources(),
R.drawable.squarsmall);
bitTopRight = BitmapFactory.decodeResource(context.getResources(),
R.drawable.squarsmall);
bitBottomLeft = BitmapFactory.decodeResource(context.getResources(),
R.drawable.squarsmall);
bitBottomRight = BitmapFactory.decodeResource(context.getResources(),
R.drawable.squarsmall);
rectAnglePaint = new Paint();
rectAnglePaint.setColor(Color.GREEN);
rectAnglePaint.setStrokeWidth(5);
rectAnglePaint.setStyle(Paint.Style.STROKE);
rectAnglePaint = new Paint();
rectAnglePaint.setColor(Color.GREEN);
rectAnglePaint.setStrokeWidth(5);
rectAnglePaint.setStyle(Paint.Style.STROKE);
bitmapPaint = new Paint();
bitmapPaint.setColor(Color.BLACK);
rect = new Rect();
Display display = ((Activity) context).getWindowManager()
.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
maxX = size.x;
maxY = size.y;
centerX = maxX / 2;
centerY = maxY / 2;
rect.left = centerX / 2 + bitBottomRight.getWidth() / 2;
rect.top = centerY / 2 + bitBottomRight.getWidth() / 2;
rect.right = centerX + centerX / 2 + bitBottomRight.getWidth() / 2;
rect.bottom = centerY + centerY / 2 + bitBottomRight.getWidth() / 2;
canvasPaint = new Paint();
canvasPaint.setColor(Color.TRANSPARENT);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawPaint(canvasPaint);
// Path p = new Path();
canvas.drawBitmap(bitTopLeft,
rect.left - bitBottomRight.getWidth() / 2, rect.top
- bitBottomRight.getWidth() / 2, bitmapPaint);
canvas.drawBitmap(bitTopRight, rect.right - bitBottomRight.getWidth()
/ 2, rect.top - bitBottomRight.getWidth() / 2, bitmapPaint);
canvas.drawBitmap(bitBottomLeft, rect.left - bitBottomRight.getWidth()
/ 2, rect.bottom - bitBottomRight.getWidth() / 2, bitmapPaint);
canvas.drawBitmap(bitBottomRight,
rect.right - bitBottomRight.getWidth() / 2, rect.bottom
- bitBottomRight.getWidth() / 2, bitmapPaint);
canvas.drawRect(rect, rectAnglePaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
invalidate();
break;
case MotionEvent.ACTION_MOVE:
int currentx = (int) event.getX();
int currenty = (int) event.getY();
Calculatingpoint(currentx, currenty);
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
private void Calculatingpoint(int x, int y) {
if (x < maxX && y < maxY) {
int dx = 0;
int dy = 0;
dx = rect.right - x;
dy = rect.bottom - y;
// this is working perfect when i touched right bottom.
rect.inset(dx, dy);
invalidate();
}
}
}
公共类CustomRectangle扩展视图{
私有位图位左上角;
私有位图位权;
私有位图位左下角;
私人点阵图权;
私人涂料矩形涂料;
私人语境;
私人涂料;
私人直肠;
私有int-maxX;
私有int-maxY;
私人int centerX;
私人国际中心;
私人油漆画布;
公共自定义矩形(上下文){
超级(上下文);
this.context=上下文;
Init();
}
私有void Init(){
bitTopLeft=BitmapFactory.decodeResource(context.getResources(),
R.可拉拔。方形小);
bitTopRight=BitmapFactory.decodeResource(context.getResources(),
R.可拉拔。方形小);
bitBottomLeft=BitmapFactory.decodeResource(context.getResources(),
R.可拉拔。方形小);
bitBottomRight=BitmapFactory.decodeResource(context.getResources(),
R.可拉拔。方形小);
矩形绘制=新绘制();
长方形颜料。setColor(颜色。绿色);
矩形油漆。设置行程宽度(5);
矩形绘制.setStyle(绘制.Style.STROKE);
矩形绘制=新绘制();
长方形颜料。setColor(颜色。绿色);
矩形油漆。设置行程宽度(5);
矩形绘制.setStyle(绘制.Style.STROKE);
bitmapPaint=新绘制();
bitmapPaint.setColor(颜色为黑色);
rect=新的rect();
显示=((活动)上下文)。getWindowManager()
.getDefaultDisplay();
点大小=新点();
display.getSize(size);
maxX=大小.x;
maxY=大小.y;
centerX=maxX/2;
centerY=maxY/2;
rect.left=centerX/2+bit bottomright.getWidth()/2;
rect.top=centerY/2+bit bottomright.getWidth()/2;
rect.right=centerX+centerX/2+bitBottomRight.getWidth()/2;
rect.bottom=centerY+centerY/2+bitBottomRight.getWidth()/2;
画布油漆=新油漆();
canvasPaint.setColor(颜色.透明);
}
@凌驾
受保护的void onDraw(画布){
帆布。拉丝漆(帆布漆);
//路径p=新路径();
canvas.drawBitmap(bitTopLeft,
rect.left-bitBottomRight.getWidth()/2,rect.top
-bitBottomRight.getWidth()/2,bitmapPaint);
drawBitmap(bitTopRight,rect.right-bitBottomRight.getWidth()
/2,rect.top-bitBottomRight.getWidth()/2,bitmapPaint);
drawBitmap(bitBottomLeft,rect.left-bitBottomRight.getWidth()
/2,rect.bottom-bitBottomRight.getWidth()/2,bitmapPaint);
canvas.drawBitmap(右下角,
rect.right-bitBottomRight.getWidth()/2,rect.bottom
-bitBottomRight.getWidth()/2,bitmapPaint);
canvas.drawRect(rect,rectAnglePaint);
}
@凌驾
公共布尔onTouchEvent(运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
使无效();
打破
case MotionEvent.ACTION\u移动:
int currentx=(int)event.getX();
int currenty=(int)event.getY();
计算点(电流x,电流y);
打破
case MotionEvent.ACTION\u UP:
打破
违约:
打破
}
返回true;
}
专用空心计算点(整数x,整数y){
if(x
但当我触摸其他角落时,矩形就消失了
我需要从中心点画矩形。我需要根据触摸增加或减少宽度和高度
请给出建议,如何实现这一点。请给我样本。我从用户触摸位置找到方向,这是我的更新代码
public class CustomRectangle extends View {
private Bitmap bitTopLeft;
private Bitmap bitTopRight;
private Bitmap bitBottomLeft;
private Bitmap bitBottomRight;
private Paint rectAnglePaint;
private Context context;
private Paint bitmapPaint;
private Rect rect;
private int maxX;
private int maxY;
private int centerX;
private int centerY;
private Paint canvasPaint;
private String direction;
public CustomRectangle(Context context) {
super(context);
this.context = context;
Init();
}
private void Init() {
bitTopLeft = BitmapFactory.decodeResource(context.getResources(),
R.drawable.squarsmall);
bitTopRight = BitmapFactory.decodeResource(context.getResources(),
R.drawable.squarsmall);
bitBottomLeft = BitmapFactory.decodeResource(context.getResources(),
R.drawable.squarsmall);
bitBottomRight = BitmapFactory.decodeResource(context.getResources(),
R.drawable.squarsmall);
rectAnglePaint = new Paint();
rectAnglePaint.setColor(Color.GREEN);
rectAnglePaint.setStrokeWidth(5);
rectAnglePaint.setStyle(Paint.Style.STROKE);
rectAnglePaint = new Paint();
rectAnglePaint.setColor(Color.GREEN);
rectAnglePaint.setStrokeWidth(5);
rectAnglePaint.setStyle(Paint.Style.STROKE);
bitmapPaint = new Paint();
bitmapPaint.setColor(Color.BLACK);
rect = new Rect();
Display display = ((Activity) context).getWindowManager()
.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
maxX = size.x;
maxY = size.y;
centerX = maxX / 2;
centerY = maxY / 2;
rect.left = centerX / 2 + bitBottomRight.getWidth() / 2;
rect.top = centerY / 2 + bitBottomRight.getWidth() / 2;
rect.right = centerX + centerX / 2 + bitBottomRight.getWidth() / 2;
rect.bottom = centerY + centerY / 2 + bitBottomRight.getWidth() / 2;
canvasPaint = new Paint();
canvasPaint.setColor(Color.TRANSPARENT);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawPaint(canvasPaint);
// Path p = new Path();
canvas.drawBitmap(bitTopLeft,
rect.left - bitBottomRight.getWidth() / 2, rect.top
- bitBottomRight.getWidth() / 2, bitmapPaint);
canvas.drawBitmap(bitTopRight, rect.right - bitBottomRight.getWidth()
/ 2, rect.top - bitBottomRight.getWidth() / 2, bitmapPaint);
canvas.drawBitmap(bitBottomLeft, rect.left - bitBottomRight.getWidth()
/ 2, rect.bottom - bitBottomRight.getWidth() / 2, bitmapPaint);
canvas.drawBitmap(bitBottomRight,
rect.right - bitBottomRight.getWidth() / 2, rect.bottom
- bitBottomRight.getWidth() / 2, bitmapPaint);
canvas.drawRect(rect, rectAnglePaint);
}
float x1, x2, y1, y2, dx, dy;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1 = event.getRawX();
y1 = event.getRawY();
invalidate();
break;
case MotionEvent.ACTION_MOVE:
x2 = event.getRawX();
y2 = event.getRawY();
int currentx = (int) event.getX();
int currenty = (int) event.getY();
Calculatingpoint(currentx, currenty);
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
private void Calculatingpoint(int x, int y) {
if (x2 < maxX && y2 < maxY) {
int dx = 0;
int dy = 0;
// dx = rect.right - (int)x2 ;
// dy = (int)y2 - rect.top ;
//
// Log.e("dx", ""+dx);
// Log.e("dy", ""+dy);
boolean isLeft = false;
boolean isTop = false;
if (x2 > maxX / 2) {
direction = "right";
isLeft = false;
} else {
direction = "left";
isLeft = true;
}
if (y2 > maxY / 2) {
direction = "bottom";
isTop = false;
} else {
direction = "top";
isTop = true;
}
if (!isLeft && !isTop) {
dx = rect.right - (int) x2;
dy = rect.bottom - (int) y2;
}
if (isLeft && !isTop) {
dx = (int) x2 - rect.left;
dy = rect.bottom - (int) y2;
}
if (isLeft && isTop) {
dx = (int) x2 - rect.left;
dy = (int) y2 - rect.top;
}
if (!isLeft && isTop) {
dx = rect.right - (int) x2;
dy = (int) y2 - rect.top;
}
// this will perfect
rect.inset(dx, dy);
invalidate();
}
}
}
公共类CustomRectangle扩展视图{
私有位图位左上角;
私有位图位权;
私有位图位左下角;
私人点阵图权;
私人涂料矩形涂料;
私人语境;
私人涂料;
私人直肠;
私有int-maxX;
私有int-maxY;
私人int centerX;
私人国际中心;
私人油漆画布;
私有字符串方向;
公共自定义矩形(上下文){
超级(上下文);
this.context=上下文;
Init();
}
私有void Init(){
bitTopLeft=BitmapFactory.decodeResource(context.getResources(),
R.可拉拔。方形小);
bitTopRight=BitmapFactory.decodeResource(context.getResources(),
R.可拉拔。方形小);
bitBottomLeft=BitmapFactory.decodeResource(context.getResources(),
R.可拉拔。方形小);
bitBottomRight=BitmapFactory.decodeResource(context.getResources(),
R.可拉拔。方形小);
矩形绘制=新绘制();
长方形颜料。setColor(颜色。绿色);
矩形油漆。设置行程宽度(5);
矩形绘制.setStyle(绘制.Style.STROKE);
矩形绘制=新绘制();
长方形颜料。setColor(颜色。绿色);
矩形油漆。设置行程宽度(5);
矩形绘制.setStyle(绘制.Style.STROKE);
bitmapPaint=新绘制();
bitmapPaint.setColor(颜色为黑色);
rect=新的rect();
显示=((活动)上下文)。getWindowManager()
.getDefaultDisplay();
点大小=新点();
display.getSize(size);
maxX=大小.x;
maxY=大小.y;
centerX=maxX/2;
centerY=maxY/2;
rect.left=centerX/2+bit bottomright.getWidth()/2;
rect.top=centerY/2+bit bottomright.getWidth()/2;
rect.right=centerX+centerX/2+bitBottomRight.getWidth()/2;
rect.bottom=centerY+centerY/2+bitBottomRight.getWidth()/2;
画布油漆=新油漆();
canvasPaint.setColor(颜色.透明);
}
@凌驾
受保护的void onDraw(画布){