【问题标题】:Android view/canvas drawCircle issue with ICSICS 的 Android 视图/画布 drawCircle 问题
【发布时间】:2014-10-08 20:39:28
【问题描述】:

我有一个在 HoneyComb 上运行良好但在 ICS 上运行不正常的 Android 应用程序。我有谷歌地图,最重要的是,我正在使用圆圈创建雷达效果(圆圈的半径不断增加,给出一种水波效果。)代码如下:

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>

【问题讨论】:

    标签: android view draw android-4.0-ice-cream-sandwich hardware-acceleration


    【解决方案1】:

    我可以通过将 android 清单文件中的 android:targetVersion 更改为 10 来解决此问题。它不能使用 API>=11 的原因是 AsyncTask 方法的行为发生了变化。看看Android AsyncTask not being called for minutes on ICS

    【讨论】:

      【解决方案2】:

      Api Level 10 以上的 AsycTask 改变了执行机制,当你提到 targetSdk :10 时,apk 会为 API 级别 10 编译,因此 dalvik 机器将其视为。如果你想要更快的响应,请使用以下命令API 级别 >10 的过程

      http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor(java.util.concurrent.Executor,Params...)

      【讨论】:

        【解决方案3】:

        我在使用 targetSDKVersion 13 或更低版本时遇到了同样的问题。圆圈没有出现。

        为视图禁用硬件加速的解决方案。显然,drawCircle 函数不适用于 pre ICS 上的 accel。 我在视图的 init 函数中添加了以下行:

        setLayerType(View.LAYER_TYPE_SOFTWARE,null);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-31
          • 1970-01-01
          相关资源
          最近更新 更多