Android 绕备用轴旋转

Android 绕备用轴旋转,android,Android,我正在努力进行位图旋转。我希望绕一个备用轴旋转一个图形,但我只能让它绕中心点旋转,不管我做什么,在PostTranslate中。翻译前,以任何顺序设置翻译都不起作用。我也尝试过后旋转(45,0,0),但它总是围绕中心旋转。 下面的代码采取的互联网我会怎么做,以改变其旋转点,下面的代码使用的发射器图标,这是方形的,我正在使用一个细长的图形,如箭头 // Rotate image to 45 degrees. public void RotateImage(){ ImageView ima

我正在努力进行位图旋转。我希望绕一个备用轴旋转一个图形,但我只能让它绕中心点旋转,不管我做什么,在PostTranslate中。翻译前,以任何顺序设置翻译都不起作用。我也尝试过后旋转(45,0,0),但它总是围绕中心旋转。 下面的代码采取的互联网我会怎么做,以改变其旋转点,下面的代码使用的发射器图标,这是方形的,我正在使用一个细长的图形,如箭头

// Rotate image to 45 degrees.

public void RotateImage(){
    ImageView image;
    Bitmap bMap;
    Matrix matrix;

    //Get ImageView from layout xml file
    image = (ImageView) findViewById(R.id.imageView1);

    //Decode Image using Bitmap factory.
    bMap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);

    //Create object of new Matrix.
    matrix = new Matrix();

    //set image rotation value to 45 degrees in matrix.
    matrix.postRotate(45);

    //Create bitmap with new values.
    Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0,
            bMap.getWidth(), bMap.getHeight(), matrix, true);

    //put rotated image in ImageView.
    image.setImageBitmap(bMapRotate);
}
我试过下面的代码,但它仍然围绕中心旋转,或者至少也会出现

public void RotateImage{

     ImageView image;
     Bitmap bMap;
     Matrix matrix;

     //Get ImageView from layout xml file
     image = (ImageView) findViewById(R.id.imageView);

     //Decode Image using Bitmap factory.
     bMap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);

     //Create object of new Matrix.
     matrix = new Matrix();

     //set image rotation value to 45 degrees in matrix.
     matrix.setTranslate(-100,-200);
     matrix.postRotate(angle);
     matrix.postTranslate(100,200);
     //Create bitmap with new values.
     Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0,
             bMap.getWidth(), bMap.getHeight(), matrix, true);

     //put rotated image in ImageView.
     image.setImageBitmap(bMapRotate);

谢谢

如果您希望位图使用轴(a,b)绕x轴旋转45度,可以调用
矩阵。旋转(45,a,b)
也许您希望使用Camera类绕x、Y或Z轴旋转:

matrix = new Matrix();

Camera camera = new Camera();
camera.save();
camera.rotateX(45f);
camera.getMatrix(matrix);
camera.restore();

我理解您的问题的方式是,您希望围绕某个点旋转图像,例如
(x,y)
。从概念上讲,您需要对图像执行以下转换:

  • 通过
    (-x,-y)
  • 旋转45度
  • 通过
    (x,y)

  • 可以使用此方法从中心旋转对象。在“精灵”类中创建此方法

    public void paintFromCenter(float angle, Canvas c) {
        Bitmap b = sprite;
        Bitmap h = b;
        // Canvas canvas = new Canvas(a);
        Matrix matrix = new Matrix();
        matrix.postRotate(angle, h.getWidth() / 2, h.getHeight());
        matrix.postTranslate(getX(), getY());
        // canvas.drawBitmap(bitmap, matrix, new Paint());
        Bitmap bmp2 = Bitmap.createBitmap(h, 0, 0, frameWidth, frameHeight,
                matrix, true);
        c.drawBitmap(h, matrix, null);
        // g.getCanvas().drawBitmap(bmp2, getX(), getY(), null);
    }
    
    现在在onTouchEvent()中


    试试看

    矩阵似乎没有旋转方法,我想你可能是指后旋转(45,a,b),它似乎仍然围绕中心旋转,文档确实表明这是可行的,但是我的总是出现在中间,我猜想这个视图可以重定向它,但是就是不能解决它。@ USER 31297可以提供你正在使用的示例值吗?还发布了一些a和b不同值的输出屏幕截图。你指的是哪个
    Camera
    类?android.graphics.CameraI我认为这并不能回答这个问题。我把这个问题理解为询问如何围绕图像中心以外的另一点旋转图像。我同意我没有使用相机图像,我在抽屉里用的是图形folder@pskink是一样的。这就是
    postRotate()
    文档的意思吗?在我看来,这些文档是神秘的,或者使用了我不熟悉的数学符号。我添加了下面的内容,但它保持在中心位置。我不太理解PRE、Post、Set前缀,所以只是猜测,但它仍然围绕中心矩阵旋转。setTranslate(-100,-200);矩阵。旋转后(角度);矩阵。后翻译(100200)@用户3129787如果仍然无法工作,请使用转换的完整代码编辑OP。电话的准确顺序在这里非常重要。
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
    
            evX = (int) event.getX();
            evY = (int) event.getY();
            int initX = objectSprite.getX();
            int inity = objectSprite.getY();
    
            if ((evX > objectSprite.getX()
                    && evX < objectSprite.getX() + objectSprite.getWidth()
                    && evY > objectSprite.getY() && evY < objectSprite.getY()
                    + objectSprite.getHeight())) {
                if (angle < 90) {
                    angle += 5;
                } else if (angle < -180)
                    angle -= 5;
    
            }
    }
    
        return true;
    }
    
    private void draw(Canvas canvas) {
    objectSprite.paintFromCenter(angle, canvas);
    }