在Android中旋转一个可绘制对象

23

当从资源加载Drawable时,如何在绘制它时旋转它?例如,我想绘制一个箭头,并能够将其旋转以面向不同的方向。


问题有所不同,但我认为答案可能是相关的。 - Computerish
这个回答解决了你的问题吗?在Android上的画布上旋转图像 - Mahozad
4个回答

21

你需要使用Bitmap和Canvas类的函数来准备可绘制对象:

Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.image2);
Bitmap bmResult = Bitmap.createBitmap(bmpOriginal.getWidth(), bmpOriginal.getHeight(), Bitmap.Config.ARGB_8888);
Canvas tempCanvas = new Canvas(bmResult); 
tempCanvas.rotate(90, bmpOriginal.getWidth()/2, bmpOriginal.getHeight()/2);
tempCanvas.drawBitmap(bmpOriginal, 0, 0, null);

mImageView.setImageBitmap(bmResult);

这段代码示例会在图像中心进行90度旋转。


如果您需要使图像半透明或需要缩放功能,您也可以查看此链接:https://dev59.com/6VPTa4cB1Zd3GeqPimL7#4689624 - Zelimir
我这边也可以正常工作。你遇到了什么问题? - Zelimir
正如Jay几年前所说,如果原始位图是正方形,那么这个方法非常有效,但对于非正方形的位图呢? - Apqu
1
正如我几年前所问的那样,你遇到了什么问题? - Zelimir
1
另一种可能的旋转位图的方法,但不需要在堆上创建临时位图(这可能会占用大量空间,加上原始位图),可以在此处找到:https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations - android developer

10

本质上可以归纳为: 不要转换可绘制对象,而是进行(反向)画布变换

private BitmapDrawable drawable; // or Drawable

protected void onDraw(Canvas canvas) { // inherited from View 
  //...
  canvas.save();
  canvas.rotate(degrees, pivotX, pivotY);
  drawable.draw(canvas);
  canvas.restore();
  //...
}

如果你有一个BitmapDrawable,可能希望通过设置抗锯齿来提高输出的质量。

drawable.setAntialias(true);

我认为这是目前最有效的解决方案。 - Mario Lenci
实际上,canvas.rotate() 必须在绘制 drawable 之前完成。 - Ridcully
你不会错过onMeasure函数的实现吧? - android developer

3

接受的答案对我无效。我的图片不是正方形的,所以我稍微修改了他的代码。

private Bitmap rotateDrawable(@DrawableRes int resId) {
    Bitmap bmpOriginal = BitmapFactory.decodeResource(getResources(), resId);
    Bitmap bmpResult = Bitmap.createBitmap(bmpOriginal.getHeight(), bmpOriginal.getWidth(), Bitmap.Config.ARGB_8888);
    Canvas tempCanvas = new Canvas(bmpResult);
    int pivot = bmpOriginal.getHeight() / 2;
    tempCanvas.rotate(90, pivot, pivot);
    tempCanvas.drawBitmap(bmpOriginal, 0, 0, null);
    return bmpResult;
}

mImageView.setImageBitmap(rotateDrawable(R.drawable.some_image));

0

1
不是问题的要求,这是在一系列图像之间旋转,所需的是单个图像的平面旋转! - fredley
实际上,您可以使用补间动画对单个Drawable执行旋转。http://developer.android.com/guide/topics/resources/animation-resource.html#Tween - edthethird

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接