2011-12-09 57 views
0

我已经实现了一个能够获取其他人的距离和方向的程序。现在我想通过指向其他人的方向(如针)的动态箭头显示此信息,并且当用户移动他的手机时,箭头将改变其方向以指向另一个人的方向。 因此,要这样实施:活动将以度为单位(0 < = x < = 360)传递(其他人的)方向到另一个活动,该活动的任务是以图形方式显示箭头。 我知道如何知道方位角值,从而计算特定方向值(x)的箭头旋转角度。我知道实施的逻辑,但我不知道图形,动画等。绘制指向地球上特定位置的动态箭头

任何快速帮助,高度赞赏。

+0

确定...好不容易才找到一个解决方案,它会以某种方式满足确切的要求,将发布几个小时后的解决方案,不准我之前发布8小时的发帖任务。虽然有更好的答案等待.. –

回答

0

这是符合要求的代码。我不知道,但一个更好的解决方案可能存在: -

 package com.visd.giraffe; 

     import android.app.Activity; 
     import android.graphics.Bitmap; 
     import android.graphics.BitmapFactory; 
     import android.graphics.Matrix; 
     import android.graphics.drawable.BitmapDrawable; 
     import android.hardware.Sensor; 
     import android.hardware.SensorEvent; 
     import android.hardware.SensorEventListener; 
     import android.hardware.SensorManager; 
     import android.os.Bundle; 
     import android.util.Log; 
     import android.widget.ImageView; 
     import android.widget.TextView; 


     public class arrowhandler extends Activity implements SensorEventListener { 


     Matrix mtx = new Matrix(); 
     ImageView img; 
     Bitmap bmp ; 
     int w,h; 
     float d = 0; 
     float oldval = 0,currentrot = 0, rotate = 0,senserotat; 

     private SensorManager sensorManager = null; 

      /** Called when the activity is first created. */ 
      @Override 
      public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       // Get a reference to a SensorManager 
       sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
       setContentView(R.layout.mmmain); 
       String[] arrs = getIntent().getExtras().getStringArray("SMSR"); 
       int degr = arrs[0].indexOf("Dgr:"); 
       String msgg = "Location of " + arrs[0].substring((arrs[0].indexOf("nosss"))+5) + "\n\n" + arrs[0].substring(0, degr); 
       Log.d("AOA",arrs[0].substring(degr+4)); 
       d = (Float.valueOf(arrs[0].substring(degr+4, arrs[0].indexOf("nosss")))).floatValue(); 
       Log.d("AOA dv", Float.toString(d)); 
       if (d>0) 
       { 
        d = d+180; 
       } 
       else if (d<0) 
       { 
        d = 180 - (Math.abs(d)); 
       } 
       Log.d("AOA dv", "2" + Float.toString(d)); 
       Log.d("AOA",Float.toString(d)); 
       TextView t = (TextView) findViewById(R.id.textView1); 
       t.setText(msgg);   

       img=(ImageView)findViewById(R.id.imageView1); 
       bmp = BitmapFactory.decodeResource(getResources(), R.drawable.bluearrow); 
       // Getting width & height of the given image. 
       w = bmp.getWidth(); 
       h = bmp.getHeight(); 



       } 

      // This method will update the UI on new sensor events 
      public void onSensorChanged(SensorEvent sensorEvent) { 
      synchronized (this) { 
      if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 

      } 

      if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) { 



       senserotat = d-sensorEvent.values[0]; 
       if (senserotat < 0) 
       { 
        senserotat = 360 - (Math.abs(senserotat)); 
       } 
        rotate = (360-currentrot)+senserotat; 
        if (rotate>360) 
        { 
         rotate = rotate-360; 
        } 
        mtx.postRotate(rotate); 
        // Rotating Bitmap 
        Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true); 
        BitmapDrawable bmd = new BitmapDrawable(rotatedBMP); 

        img.setImageDrawable(bmd); 
        currentrot = senserotat; 
        //Log.d("TTTT", Float.toString(sensorEvent.values[0])); 


      } 
      } 

      } 


      public void onAccuracyChanged(Sensor arg0, int arg1) { 
     // TODO Auto-generated method stub 

     } 

      @Override 
      protected void onResume() { 
      super.onResume(); 
      // Register this class as a listener for the accelerometer sensor 
      sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 
      // ...and the orientation sensor 
      sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL); 
      } 

      @Override 
      protected void onStop() { 
      // Unregister the listener 
      sensorManager.unregisterListener(this); 
      super.onStop(); 
      } 

     }