2011-09-14 15 views
8

मेरे पास एक तीर छवि है जो मैं 0 से 180 डिग्री (एक मीटर में सुई की तरह) से घूमना चाहता हूं। तीर का एक बिंदु मध्य में और स्क्रीन के नीचे और तीर के सिर को स्थानांतरित करना चाहिए। तीर की लंबाई ठीक है (यह छवि है)। इसके अलावा मेरे पास दो बटन हैं और मैं तीर को बाईं ओर चालू करना चाहता हूं जब बटन छोड़ा जाता है और सही बटन स्पर्श होने पर दाएं मुड़ता है।एंड्रॉइड, मैं एक निश्चित बिंदु के चारों ओर एक तीर (छवि) कैसे घुमा सकता हूं?

इस प्रक्रिया का तर्क क्या है?

enter image description here

+0

रोटेशन लागू करने के लिए मैट्रिस का उपयोग करें। –

+1

http://stackoverflow.com/questions/4166917/android-how-to-rotate-a-bitmap-on-a-center-point – Ronnie

+0

का सटीक डुप्लिकेट मैं आपको @Emiam उत्तर उपयोगकर्ता से सलाह देता हूं, यह CPU का उपयोग नहीं करेगा मैट्रिक्स के रूप में करते हैं। –

उत्तर

2

आप शायद एनीमेशन एंड्रॉयड में 3 डी रोटेशन का उपयोग के साथ काम करते हैं और यह भी मैट्रिक्स रोटेशन usong करने की कोशिश करने के लिए है ... मैं इस के लिए बिटमैप कोड है .........

Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.bar); 
       Matrix mtx = new Matrix(); 
    mtx.postRotate(180); // rotating 180 degrees clockwise 
    Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth() ,bmp.getHeight() , mtx, true); // creating the bitmap image with new angle 

भी जाँच इस

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.html

+0

यह एक अच्छी रणनीति नहीं है क्योंकि बिटमैप.क्रेट बिटमैप विधि बहुत धीमी है, और यह कर रही है कि प्रत्येक फ्रेम एफपीएस दर को मार देगा। – Emiam

5

यह वास्तव में बहुत सरल है अगर आप एक कैनवास का उपयोग कर रहे अपने ड्राइंग करने के लिए (जैसा कि आपको अपने मामले में होना चाहिए)। एक पूर्णांक मान है कि आप को बढ़ा देते/कमी जब उपयोगकर्ता क्लिक

private void doDraw(Canvas canvas) { 
canvas.save(); 
float px = ...; 
float py = ...; 
canvas.rotate(degrees, px, py); 
arrow.draw(canvas); 
canvas.restore(); 
} 

डिग्री हो जाएगा:

यह देखते हुए कि आप बिंदु के लिए निर्देशांक जो चारों ओर छवि को घुमाने चाहिए पता है, तुम इसे इस तरह से कर सकते हैं एल या आर बटन। कैनवास.रोटेट बाकी का ख्याल रखता है!

+0

यह वास्तव में मेरे लिए बिल्कुल काम नहीं करता है (कोई रोटेशन नहीं, आउटपुट नहीं)। मैं सोच रहा हूं कि यह मेरा एक्सएमएल सेट-अप है ..? –

1
ImageView arrow = findViewById(/* id of your arrow */); 
int width = arrow.getWidth(); 
int height = arrow.getHeight(); 
newAngle = /* init it by needed angle */; 
RotateAnimation animation = new RotateAnimation(oldAngle, newAngle, width/2, height); 
oldAngle = newAngle; 
animation.setDuration(200); // you may set another duration 
animation.setFillAfter(true); 
arrow.startAnimation(animation); 

शुभकामनाएँ!

2

तो संक्षिप्त उत्तर और लंबा उत्तर है।

संक्षिप्त उत्तर यह है कि बिटमैप्स और कैनवास का घूर्णन एक आम कार्य होता है, जिसे आमतौर पर "घुमाने" कहा जाता है और आमतौर पर घूमने के लिए बिंदु को ले जाता है।

लंबा उत्तर यह है कि सभी 2 डी और 3 डी ग्राफिक्स मैट्रिक्स बीजगणित की एक चाल में भंग हो जाते हैं। प्रत्येक बिंदु के लिए: new_x = factor_1 * old_x + factor_2 * old_y + factor_3 ...

इन कारकों एक मैट्रिक्स में वास्तव में अच्छी तरह से काम करते हैं, और यही कारण है कि मैट्रिक्स बात इतना लोकप्रिय हो गया। एक अच्छी चाल है जहां आप एक साथ परिवर्तनों को चेन करते हैं, ताकि आप अपनी समस्याओं को "पुरानी कैनवास ले सकें, इसे स्थानांतरित करें ताकि स्पर्श बिंदु मूल हो, इसे घुमाएं, और फिर इसे स्थानांतरित करें ताकि मूल वापस आ जाए स्पर्श बिंदु। " या मैट्रिक्स एम = नया मैट्रिक्स()। पोस्टट्रांसलेट (-टouch_एक्स, -टouch_ई)। पोस्टस्टोट (360/20)। पोस्टस्ट्रांसलेट (touch_x, touch_y) प्रत्येक बार सर्कल के 1/20 वें स्थान पर घुमाने के लिए। फिर आप मैट्रिक्स को किसी भी फ़ंक्शन पर पास करते हैं जो "रूपांतरण" मैट्रिक्स लेता है।

अच्छी बात यह है कि आप केवल एक बार उस मैट्रिक्स के लिए सभी गणना करते हैं, और उसके बाद प्रत्येक बिंदु पर समान 4 गुणाओं और जोड़ने का एक समूह उपयोग करते हैं। वास्तव में, यह इतना आम है कि वीडियो कार्ड और इंटेल निर्देश दोनों हार्डवेयर में यह सामान करते हैं। आप अगले परिणाम प्राप्त करने के लिए उसी मैट्रिक्स द्वारा परिणामस्वरूप छवि को फिर से गुणा कर सकते हैं।

अब, यदि आप वास्तव में ग्राफिक्स हैक के लिए पूछ रहे हैं कि मैं कुछ स्मृति के साथ कुछ बेहद तेज़ असेंबली कोड में ऐसा कैसे कर सकता हूं, तो चाल घूर्णन और त्रुटियों को छोटी श्रृंखलाओं में चुनना है जहां आपको बफर की आवश्यकता नहीं है ।उदाहरण के लिए, एक साधारण 90 डिग्री रोटेशन पहले चार कोनों को स्वैप करेगा, फिर यह स्वैप करेगा (ऊपरी बाएं + 1 बाएं ऊपरी दाएं + 1 में चला जाता है जो नीचे दाएं - 1 बाएं में जाता है जो नीचे बाएं - 1 नीचे जाता है, जो ऊपरी बाएं + 1 में वापस चला जाता है)। ये चाल आमतौर पर केवल स्मृति बाधाओं के लिए मायने रखती हैं।

रास्ता बहुत अधिक जानकारी। अपनी समस्या के बारे में हमें और बताएं।

0

मैं this उदाहरण देख सकते हैं और मैं और अधिक या कम काम करने के लिए अनुकूलित की तरह आप की जरूरत है, कृपया मेरी कोड :)


import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.widget.ImageView; 
import android.widget.SeekBar; 

public class TesteRotateActivity extends Activity implements 
    SeekBar.OnSeekBarChangeListener { 

private ImageView myImageView; 
private SeekBar seekbarRotate; 
private float curScale = 1F; 
private float curRotate = 0F; 
private Bitmap bitmap; 
private int bmpHeight; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    myImageView = (ImageView) findViewById(R.id.imageview); 
    seekbarRotate = (SeekBar) findViewById(R.id.rotate); 
    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.teste);//here you insert your image 
    bmpHeight = bitmap.getHeight(); 
    drawMatrix(); 
    seekbarRotate.setOnSeekBarChangeListener(this); 
} 

private void drawMatrix() { 
    Matrix matrix = new Matrix(); 
    Matrix matrixb = new Matrix(); 
    Matrix matrixc = new Matrix(); 
    matrix.postScale(curScale, curScale); 
    matrixb.setRotate(curRotate, 100, bmpHeight); 
    matrixc.setTranslate(100, 0); 
    matrix.setConcat(matrixb, matrixc); 
    Bitmap targetBitmap = Bitmap.createBitmap(200, bmpHeight, 
      bitmap.getConfig()); 
    Canvas canvas = new Canvas(targetBitmap); 
    canvas.drawBitmap(bitmap, matrix, new Paint()); 
    myImageView.setImageBitmap(targetBitmap); 
} 

@Override 
public void onProgressChanged(SeekBar seekBar, int progress, 
     boolean fromUser) { 
    curRotate = (float) progress; 
    drawMatrix(); 
} 

@Override 
public void onStartTrackingTouch(SeekBar seekBar) { 
} 

@Override 
public void onStopTrackingTouch(SeekBar seekBar) { 
} 

} 

मुख्य

की एक्सएमएल का एक बेहतर समझ के लिए उदाहरण देखें
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/app_name" /> 

<SeekBar 
    android:id="@+id/rotate" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5px" 
    android:max="360" 
    android:progress="0" /> 

<ImageView 
    android:id="@+id/imageview" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:scaleType="center" /> 

</LinearLayout> 
संबंधित मुद्दे