Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 矩形-更改运动事件的宽度和高度?_Java_Android_Android View - Fatal编程技术网

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(画布){