2011-01-21 33 views
16

Làm cách nào để có thể quay số Drawable từ tài nguyên được quay khi được vẽ? Ví dụ, tôi muốn vẽ một mũi tên và có thể xoay nó theo hướng khác nhau khi nó được vẽ?Xoay một bản vẽ trong Android

+0

có thể trùng lặp [Làm cách nào để vẽ mũi tên chỉ đường lái xe trong MapView?] (Http://stackoverflow.com/questions/4331794/how-can-i-draw-an-arrow-showing -e-driving-direction-in-mapview) – Jonas

+0

Câu hỏi này khá khác, nhưng tôi nghĩ câu trả lời có thể liên quan. – Computerish

Trả lời

20

Bạn cần phải sử dụng chức năng Bitmap và Canvas Class để chuẩn bị drawable:

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); 

Trong mẫu mã này quay 90 độ trên trung tâm hình ảnh xảy ra.

+0

OK, Nếu bạn cần tạo hình bán trong suốt hoặc cần tính năng thu phóng, bạn cũng có thể kiểm tra http://stackoverflow.com/questions/4688306/how-can-i-make-image-opaque-to-some- này mức độ/4689624 # 4689624 – Zelimir

+2

Hoạt động tốt nếu bitmap gốc là hình vuông:) .... nếu nó không đúng? – Jay

+0

Hoạt động tốt cho tôi. Vấn đề bạn gặp phải là gì? – Zelimir

0

cơ bản này: link

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); 
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); 
spaceshipImage.startAnimation(hyperspaceJumpAnimation); 

nguồn:

http://developer.android.com/guide/topics/graphics/2d-graphics.html#tween-animation

+1

Không phải những gì người hỏi muốn, điều này xoay giữa một loạt các hình ảnh, những gì đã được mong muốn là một vòng quay phẳng của một hình ảnh duy nhất! – fredley

+0

Trên thực tế, bạn có thể thực hiện phép quay (trên một bản vẽ) với một hoạt hình tween. http://developer.android.com/guide/topics/resources/animation-resource.html#Tween – edthethird

+0

Ed, cảm ơn sự hỗ trợ. –

9

về cơ bản nó có thể được luộc xuống: làm một (n nghịch đảo) chuyển đổi vải thay vì chuyển drawable

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(); 
    //... 
} 

nếu bạn có BitmapDrawable nó có thể được mong muốn để tăng chất lượng đầu ra bằng cách thiết lập khử răng cưa

drawable.setAntialias(true); 
+0

tôi nghĩ đây là giải pháp hiệu quả nhất hiện nay –

+0

Thực tế canvas.rotate() đã được thực hiện _before_ vẽ hình vẽ. – Ridcully

+0

bạn không bỏ lỡ việc thực hiện chức năng onMeasure? –

2

Câu trả lời được chấp nhận không phù hợp với tôi. Tôi có hình ảnh không vuông, vì vậy tôi đã thay đổi mã của mình một chút.

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));