在Android操作系统版本中,没有使用Canvas绘制的线条大于4.4

时间:2014-08-01 08:20:53

标签: android android-canvas android-version

我正在使用指定的开始和停止x,y坐标绘制一个线段,动态地使用以下位图图像上的指定绘画 -

chart_by_rule (> = 4.4意外) -

enter image description here

chart_by_rule (预期) -

enter image description here

以下代码应在上面的位图中绘制线条。这些行仅在 Android版本< 4.4

这是代码 -

@Override
public View onCreateView(LayoutInflater inflater, 
ViewGroup container, Bundle savedInstanceState) 
{
    getActivity().runOnUiThread(new Runnable() 
    {
        @Override
        public void run() 
        {
            getChartLoaded();
        }
    });

}

public void getChartLoaded()
{
    if(dates_array.indexOf(today) == -1 || (redrawChart != null && redrawChart.equals("popback"))  || (getSetting("ZoneIDChanged","0").equals("1"))) 
    {
        redrawChartView(scal, zeroPadding, zeroPaddingDate);
        setSetting("ZoneIDChanged","0");
    } 
    else 
    {
        addChartViews(scal, zeroPadding, zeroPaddingDate);
    }

}

public void redrawChartView(Calendar scal, 
String zeroPadding, String zeroPaddingDate)
{
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(driverTimeZone));
    while (scal.compareTo(cal) < 0) {
    cv = new ChartView();
    LinearLayout layout = cv.getChartView(i);
    i++;
    linearLayoutMap.put(date, layout);
    views.add(layout);
    }
}

public class ChartView 
{
    private Paint cPaint;
    float startHours = 0, endHours = 0, 
    startHeight = 0, endHeight = 0,
    scale = 0;

    public LinearLayout getChartView(final int number) 
    {
       getActivity().runOnUiThread(new Runnable() 
       {

          @Override
          public void run() {

          cPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
          cPaint.setStyle(Paint.Style.STROKE);
          cPaint.setColor(Color.BLACK);
          cPaint.setStrokeWidth(3);

          scale = getActivity().getBaseContext().getResources()
          .getDisplayMetrics().density;

          linearlayout = new LinearLayout(getActivity());

          final ImageView img = new ImageView(getActivity());

          BitmapFactory.Options options = new BitmapFactory.Options();
          options.inPurgeable = true;
          newBitmap = BitmapFactory.decodeResource(getResources(),
          chart_by_rule).copy(Bitmap.Config.ARGB_4444, true);
          canvas = new Canvas(newBitmap);
          img.setImageBitmap(newBitmap);
          img.setScaleType(ScaleType.FIT_XY);
          img.setTag(number);       
          float wFactor = (15 * scale);
          float hFactor = (float) ((19.35) * scale);
          float x1 = startHours * wFactor;
          float x2 = endHours * wFactor;
          float y1 = (2 * startHeight - 1) * hFactor;
          float y2 = (2 * endHeight - 1) * hFactor;

          canvas.drawLine(x1, y1, x2, y2, cPaint);
          canvas.save(Canvas.ALL_SAVE_FLAG);
          linearlayout.addView(img);
        }
     });
        return linearlayout;
   }
} 
  

此代码在所有较小的Android版本中运行良好   4.4。

Android OS >= 4.4中,我在包含图像视图的线性布局上没有使用画布绘制线条。

这些后来的操作系统版本是否有任何关于Canvas的更改或问题可能在其他地方?

更多:我为所有屏幕布局设置了不同的布局文件。

使用Motorola XT907检查了这一点。

这是电话规范 - http://wiki.cyanogenmod.org/w/Xt907_Info

1 个答案:

答案 0 :(得分:2)

DiskLruCache相关的问题是缓存页面。

注意:您创建实例的位置非常重要。

<强> DiskLruCache

基于磁盘的LRU缓存的Java实现,专门针对Android兼容性。

DiskLruCache doc提及,

  

此类可以容忍一些I / O错误。如果缺少文件   在文件系统中,相应的条目将从中删除   缓存。如果在写入缓存值时发生错误,编辑将会   安静地失败。来电者应该通过捕捉处理其他问题   IOException并正确响应。

<强>解决方案:

我有 -

final int DISK_CACHE_SIZE = 1024 * 1024 * memClass / 10;

cache = new DiskLruImageCache(getActivity(), DISK_CACHE_SUBDIR,
        DISK_CACHE_SIZE, CompressFormat.JPEG, 100);

其中,DiskLruImageCache是一个类。

此缓存实例代码位于片段的onCreate()方法。

onCreate()中移除代码并将其放在onCreateView()片段方法中。

现在android 4.4及更高版本也显示了带有绘制线的位图。

这很奇怪,但在这方面似乎有一些变化造成了这样的问题。

重复使用位图

然后我发现该文章在whats-changed-in-android-4-4-kitkat重用位图。

如上所述,

包含

Bitmap.reconfigure()以修改现有实例以适应新的维度和像素配置。 BitmapFactory已针对此重新配置行为进行了更新,以便在Bitmap中重复使用。

您可以安全地将200×200的{​​{1}}实例重新配置为ARGB_8888的{​​{1}},然后再100×100 ARGB_8888的{​​{1}},因为所有这些都适合初始分配。但是,如果我尝试在300×300将其重新配置为RGB_565,则会引发异常。同样重要的是要注意,在将Bitmap附加到视图时,无法重新配置它。这应该在元素分离或移出屏幕后完成。

因此,如果您的应用程序可以确定单个实例的合适大小,即使它可能大于任何给定时间所需的像素,您仍然可以减少内存使用量。对300×300ARGB_8888图片重复使用的单个360KB位图(显然不会同时显示)对于每个人而言比对两个单独的实例需要300×300更好。

我希望以后可能会遇到这个问题的人会从这里得到帮助。