我正在使用指定的开始和停止x,y坐标绘制一个线段,动态地使用以下位图图像上的指定绘画 -
chart_by_rule (> = 4.4意外) -
chart_by_rule (预期) -
以下代码应在上面的位图中绘制线条。这些行仅在 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。
答案 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×300
和ARGB_8888
图片重复使用的单个360KB
位图(显然不会同时显示)对于每个人而言比对两个单独的实例需要300×300
更好。
我希望以后可能会遇到这个问题的人会从这里得到帮助。