Android 在设定范围内缩放图像

Android 在设定范围内缩放图像,android,Android,我有一个应用程序,我有一个表面视图。在这个曲面视图中,我一次最多显示两个位图,它们是一部短片中的剪辑。我可以很好地工作,但是我允许用户缩放和平移图像/剪辑。我想平均分割屏幕,这样在垂直方向上,一个剪辑占据屏幕的上半部分,另一个剪辑占据屏幕的下半部分。由于这是一个表面视图,因此这些视图没有实际的分离 当前,我绘制的第二个位图,如果它穿过屏幕真实区域的虚拟边界,那么它将覆盖在另一个位图上。我想把图像中跨越边界的部分切掉,有人知道我在画布上画画时如何强制执行吗?我想到了这一点,我会在这里发布答案,以防

我有一个应用程序,我有一个表面视图。在这个曲面视图中,我一次最多显示两个位图,它们是一部短片中的剪辑。我可以很好地工作,但是我允许用户缩放和平移图像/剪辑。我想平均分割屏幕,这样在垂直方向上,一个剪辑占据屏幕的上半部分,另一个剪辑占据屏幕的下半部分。由于这是一个表面视图,因此这些视图没有实际的分离


当前,我绘制的第二个位图,如果它穿过屏幕真实区域的虚拟边界,那么它将覆盖在另一个位图上。我想把图像中跨越边界的部分切掉,有人知道我在画布上画画时如何强制执行吗?

我想到了这一点,我会在这里发布答案,以防其他人遇到类似的情况。我正在做的事情与下面类似。我创建了新的画布对象,并为这些画布对象创建了一个可写位图。然后,我可以在各个画布对象上执行任何绘制和转换,然后将它们绘制到我的SurfaceView的主画布上

if(workingBitmap==null){
        workingBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight()/2, Bitmap.Config.ARGB_4444);
        c.setBitmap(workingBitmap);
        workingBitmap2 = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight()/2, Bitmap.Config.ARGB_4444);
        c2.setBitmap(workingBitmap2);
    }

    super.onDraw(canvas);
    canvas.drawColor(Color.BLACK);
    c.drawBitmap(bitmap, 0,0,null);
    c2.drawBitmap(bitmap2, 0,-100,null);
    canvas.drawBitmap(workingBitmap, 0,0,null);
    canvas.drawBitmap(workingBitmap2, 0,canvas.getHeight()/2,null);
参数

     private float dx; // postTranslate X distance
     private float dy; // postTranslate Y distance
     private float[] matrixValues = new float[9];
     float matrixX = 0; // X coordinate of matrix inside the ImageView
     float matrixY = 0; // Y coordinate of matrix inside the ImageView
     float width = 0; // width of drawable
     float height = 0; // height of drawable
改变

       case MotionEvent.ACTION_MOVE:
        if (mode == DRAG) { // movement of first finger

        //  matrix.set(savedMatrix);
            //.
             matrix.set(savedMatrix);

                matrix.getValues(matrixValues);
                matrixX = matrixValues[2];
                matrixY = matrixValues[5];
                width = matrixValues[0] * (((ImageView) view).getDrawable()
                                        .getIntrinsicWidth());
                height = matrixValues[4] * (((ImageView) view).getDrawable()
                                        .getIntrinsicHeight());

                dx = event.getX() - start.x;
                dy = event.getY() - start.y;

                //if image will go outside left bound
                if (matrixX + dx < 0){
                    dx = -matrixX;
                }
                //if image will go outside right bound
                if(matrixX + dx + width > view.getWidth()){
                    dx = view.getWidth() - matrixX - width;
                }
                //if image will go oustside top bound
                if (matrixY + dy < 0){
                    dy = -matrixY;
                }
                //if image will go outside bottom bound
                if(matrixY + dy + height > view.getHeight()){
                    dy = view.getHeight() - matrixY - height;
                }
                matrix.postTranslate(dx, dy);
            //...

    //              if (view.getLeft() >= -392) {
   //                   matrix.postTranslate(event.getX() -               start.x, event.getY()
     //                         - start.y);
        //
     //             }
        } else if (mode == ZOOM) { // pinch zooming
            float newDist = spacing(event);
            Log.d(TAG, "newDist=" + newDist);
            if (newDist > 5f) {
                matrix.set(savedMatrix);
                scale = newDist / oldDist; // thinking i need to play around
                                            // with this value to limit it**
                matrix.postScale(scale, scale, mid.x, mid.y);
            }
        }

        break;
case MotionEvent.ACTION\u移动:
如果(模式==拖动){//第一个手指的移动
//矩阵集(savedMatrix);
//.
矩阵集(savedMatrix);
矩阵。获取值(矩阵值);
matrixX=matrixValues[2];
矩阵x=矩阵x值[5];
宽度=矩阵值[0]*((ImageView)视图).getDrawable()
.getIntrinsicWidth());
高度=矩阵值[4]*((图像视图)视图).getDrawable()
.getIntrinsicHeight());
dx=event.getX()-start.x;
dy=event.getY()-start.y;
//如果图像将超出左边界
if(matrixX+dx<0){
dx=-matrixX;
}
//如果图像将超出右边界
if(matrixX+dx+width>view.getWidth()){
dx=view.getWidth()-matrixX-width;
}
//如果图像将超出顶部边界
if(矩阵y+dy<0){
dy=-矩阵;
}
//如果图像将超出底部边界
if(矩阵y+dy+height>view.getHeight()){
dy=view.getHeight()-matrixY-height;
}
矩阵后翻译(dx,dy);
//...
//if(view.getLeft()>=-392){
//postTranslate(event.getX()-start.x,event.getY())
//-start.y);
//
//             }
}如果(mode==ZOOM){//pinch缩放,则为else
float newDist=间距(事件);
Log.d(标记“newDist=“+newDist”);
如果(新距离>5f){
矩阵集(savedMatrix);
scale=newDist/oldDist;//认为我需要到处玩
//使用此值来限制它**
矩阵。后标度(标度、标度、中x、中y);
}
}
打破