2011-12-30 6 views
0

私はこのコードを特定の場所(GPS値を使用)に矢印を使って指し示すコンパスのように使用しています。 このコードは、矢印の画像を矢印の画像に置き換えたい以外は素晴らしいことです。しかし、私はどのようにわからないのですか。 何か助けてください??描画の代わりに画像を使用して特定の場所(コンパス)を指し示す

@Override 
public void draw(Canvas canvas) { 
    double angle = calculateAngle(currentLongitude, currentLatitude, targetLongitude, targetLatitude); 
    //Correction; 
    angle-=90; 

    //Correction for azimuth 
    angle-=azimuth; 

    if((getContext() instanceof Activity) && ((Activity)getContext()).getWindowManager().getDefaultDisplay().getOrientation()==Configuration.ORIENTATION_PORTRAIT)angle-=90; 

    while(angle<0)angle=angle+360; 

    Rect rect = canvas.getClipBounds(); 

    int height = rect.bottom-rect.top; 
    int width = rect.right-rect.left; 
    int left = rect.left; 
    int top = rect.top; 

    if(height>width){ 
     top+=(height-width)/2; 
     height=width; 
    } 
    if(width>height){ 
     left+=(width-height)/2; 
     width=height; 
    } 

    float centerwidth = width/2f; 
    float centerheight = height/2f; 

    Paint p = new Paint(); 
    p.setColor(color); 
    p.setStyle(Paint.Style.FILL); 
    p.setAntiAlias(true); 

    float startX = left+(float)(centerwidth+Math.cos(deg2rad(angle))*width/3.0); 
    float startY = top+(float)(centerheight+Math.sin(deg2rad(angle))*height/3.0); 

    Path path = new Path(); 
    path.moveTo(
      startX, 
      startY); 
    path.lineTo(
      left+(float)(centerwidth+Math.cos(deg2rad(angle+140))*width/4.0), 
      top+(float)(centerheight+Math.sin(deg2rad(angle+140))*height/4.0)); 
    path.lineTo(
      left+(float)centerwidth, 
      top+(float)centerheight 
      ); 
    path.lineTo(
      left+(float)(centerwidth+Math.cos(deg2rad(angle+220))*width/4.0), 
      top+(float)(centerheight+Math.sin(deg2rad(angle+220))*height/4.0) 
      ); 

    path.lineTo(
      startX, 
      startY 
      ); 

    canvas.drawPath(path, p); 
} 

public DirectionImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(); 
} 

public DirectionImageView(Context context, AttributeSet attrs){ 
    super(context,attrs); 
    init(); 
} 

public DirectionImageView(Context context){ 
    super(context); 
    init(); 
} 


public void onSensorChanged(SensorEvent event) { 
    azimuth = event.values[0]; 
    invalidate(); 
} 

public static double calculateAngle(double x1, double y1, double x2, 
     double y2) { 
    double dx = x2 - x1; 
    double dy = y2 - y1; 

    return (Math.atan2(dx, dy) * 180)/Math.PI; 

} 

public float getAzimuth() { 
    return azimuth; 
} 

public void setAzimuth(float azimuth) { 
    this.azimuth = azimuth; 
    invalidate(); 
} 

/* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ 
/* :: This function converts decimal degrees to radians : */ 
/* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ 
public static double deg2rad(double deg) { 
    return (deg * Math.PI/180.0); 
} 

/* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ 
/* :: This function converts radians to decimal degrees : */ 
/* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ 
public static double rad2deg(double rad) { 
    return (rad * 180.0/Math.PI); 
} 

@Override 
protected void onAttachedToWindow() { 
    if(callback!=null)callback.onImageAttached(this); 
    super.onAttachedToWindow(); 
    Log.v(getClass().getName(),"onAttachedToWindow()"); 
} 

@Override 
protected void onDetachedFromWindow() { 
    if(callback!=null)callback.onImageDetached(this); 
    super.onDetachedFromWindow(); 
    Log.v(getClass().getName(),"onDetachedFromWindow()"); 
} 

public static abstract class AttachCallback { 
    public abstract void onImageAttached(DirectionImageView iv); 
    public abstract void onImageDetached(DirectionImageView iv); 
    public abstract void pauseAll(); 
    public abstract void resumeAll(); 
} 


public void setColor(int color){ 
    this.color = color; 
    invalidate(); 
} 

}

答えて

1

あなたはそれを描画するcanvas.drawBitmap()を使用し、その後、あなたの\ RES \描画可能なフォルダ(各矢印の角度に1つ?)からビットマップをロードするためにBitmapFactory.decodeResourceを()を使用することができます、各反復で新しいものをロードすると、ビットマップのrecycle()が続きます(そうでない場合、メモリがリークします)。

+0

ありがとうございます...これらのことをどこに置くか教えてください。 – Reham

+0

コードを書く方法はあなた次第です。あなたのアプリケーションの開始時にビットマップの配列に矢印イメージをロードして、Draw()メソッドで正しいイメージを描画するのは意味があります。私の主なポイントは、あなたのタスクを達成するために使用できるAPIを提供していることです。あなたのアプリケーションを設計するのはあなた次第です。ビットマップをrecycle()メソッドで明示的に解放する必要があるか、メモリが不足していることを覚えておいてください。 – BitBank

関連する問題