2013-01-13 61 views
0

我有一个Android应用程序,它在HoneyComb上运行良好,但在ICS上运行不正常。我有谷歌地图,不仅如此,我创建使用圆圈雷达效果顶部(圈子半径不断增加给样的水浪效果。)的代码如下:Android视图/ canvas drawCircle问题与ICS

class ShowRadar extends AsyncTask<Void, Void, RadarView> 
     { 

      private Context ctx; 
      private int radius; 
      private GeoPoint gp; 
      private MapView mv; 
      ShowRadar(Context ctxt, MapView mv, int radius, GeoPoint gp) 
      { 
       this.ctx = ctxt; 
       this.radius = radius; 
       this.gp = gp; 
       this.mv = mv; 
      } 

      @Override 
      protected RadarView doInBackground(Void... params) 
      { 
       RadarView rdView = new RadarView(ctx, mv, gp, radius); 
       LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
       rdView.setLayoutParams(lp); 

       return rdView; 
      } 

      @Override 
      protected void onPostExecute(RadarView result) { 
       if(this.radius <= 10000) 
       { 
        if(this.radius < 50) 
        { 
         this.radius += 50; 
        } 
        else if(this.radius < 100) 
        { 
         this.radius += 100; 
        } 
        else if(this.radius < 500) 
        { 
         this.radius += 500; 
        } 
        else 
        { 
         this.radius += 1000; 
        } 
       } 
       else 
        this.radius = 10; 

       if(radarUpdated || radarCount > 1000) 
       { 
        if(radarCount > 1000 && !radarUpdated) 
        { 
         Toast.makeText(mContext, "Delay in response, wait a while", Toast.LENGTH_SHORT).show(); 
        } 
        radarCount = 0; 
        if (oldrd != null) { 
         rel.removeView(oldrd); 
         oldrd = null; 
        } 

       } 
       else 
       { 
        radarCount++; 

        if(oldrd != null) 
        { 
         rel.removeView(oldrd); 
        } 
        oldrd = result; 
        rel.addView(result); 

        new ShowRadar(ctx, mv, this.radius, gp).execute(); 

       } 
      } 
     } 
     new ShowRadar(mContext, mapView, 10, center).execute(); 

并在下面的代码RadarView

public class RadarView extends View { 

private int circleRadius = 500; 
private GeoPoint p; 
public RadarView(Context context) { 
super(context); 
init(); 
} 

public RadarView(Context context, MapView mv, GeoPoint pt, Integer radius) 
{ 
    super(context); 
    this.mapView = mv; 
    this.p = pt; 
    this.circleRadius = radius; 
    init(); 
} 

private void init(){ 
paint = new Paint(); 
paint.setColor(Color.GREEN); 
paint.setStrokeWidth(10); 
paint.setStyle(Paint.Style.STROKE); 

} 

@Override 
protected void onDraw(Canvas canvas) { 
Projection projection = mapView.getProjection(); 
Point pt = new Point(); 
projection.toPixels(p, pt); 

float circleRadius = metersToRadius(this.circleRadius, mapView, (double)p.getLatitudeE6()/1E6); 
Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
circlePaint.setARGB(150, 12, 232, 91); 
circlePaint.setStyle(Style.STROKE); 
circlePaint.setStrokeWidth(10); 
if(canvas.isHardwareAccelerated()) 
{ 
    mapView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
} 
canvas.drawCircle((float)pt.x, (float)pt.y, circleRadius, circlePaint); 

super.onDraw(canvas); 
} 

public static int metersToRadius(float meters, MapView map, double latitude) { 
     return (int) (map.getProjection().metersToEquatorPixels(meters) * (1/ FloatMath.cos((float) Math.toRadians(latitude))));   
    } 

}

我已经通过各种论坛上消失了,发现ICS默认激活HardwareAcceleration所以我增加了以下清单中的,但没有帮助标签。任何人 都可以告诉我这里出了什么问题。

<application 
    android:hardwareAccelerated="false" 
    .... 
</application> 

回答

0

以下过程我有同样的问题与targetSDKVersion 13或更低。该圈没有出现。

为视图禁用硬件加速的解决方案。显然,drawCircle函数在ICS之前的加速时不起作用。 我将以下行添加到了我的视图的init函数中:

setLayerType(View.LAYER_TYPE_SOFTWARE,null);