Android - 从Canvas到Bitmap来改善渲染

时间:2014-09-22 15:58:56

标签: android canvas bitmap

我在这个问题上疯狂了几天。

我创建了一个自定义视图,在onDraw()方法中绘制了一些形状和文本。因为绘制的维度大于自定义视图,所以我必须重写onMeasure()方法来实现滚动。

Activity活动正常,滚动没问题,但是因为在onDraw()方法中执行了一些大的操作,Activity中的导航非常慢。必须在Draw()方法中执行这些操作。滚动导致重新绘制View,因此经常调用onDraw()方法。

自定义视图的内容会动态更改,它取决于用户通过先前活动所做的一些选择。

所以我想将我的Canvas转换为Bitmap但是有一些问题。

1)在创建Canvas之前,我无法知道Bitmap.createBitmap()的宽度和高度参数。我可以在onDraw()方法之后知道它们。所以我无法将Bitmap与Canvas相关联。

2)如果我尝试手动设置位图的尺寸,它会抛出一个OutOfMemory异常:由于形状的大小,我的Canvas非常大。

那么,我该怎么办?

onDraw()方法:

protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    if(!listaTl.isEmpty())
    {
        canvas.drawColor(Color.WHITE);      
        p.setStyle(Paint.Style.FILL_AND_STROKE); 
        p.setAntiAlias(true);   
        p.setStrokeWidth(1);
        for(TimelineGrafica t : listaTl)
        {
            if(inseritaLaPrima)
                 y = ySalvata + this.yAngoloDestroGiu + DISTANZA_FRA_TIMELINE;
            p.setColor(t.getColor());
            disegnaPunta(canvas,p,t);
            disegnaRettangolo(canvas,p,t);
            disegnaGrain(canvas,p,t);
            disegnaFatti(canvas,p,t);
            inseritaLaPrima = true;
        }
        y = ySalvata;
        inseritaLaPrima = false;
    }
    requestLayout();
}

方法" disegna *"包含一些canvas.draw *()语句。 这里,XML文件与包含自定义视图的Activity相关联。

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vScroll"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:overScrollMode="always" 
android:fastScrollEnabled="true"
android:fastScrollAlwaysVisible="true"
>
<HorizontalScrollView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:fillViewport="true"
    android:overScrollMode="always" 
    android:fastScrollEnabled="true"
    android:fastScrollAlwaysVisible="true"
>
<AppAndroid.RappresentazioneTimeline.TimelineView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scrollbars="vertical|horizontal"
/>


</HorizontalScrollView>
</ScrollView> 

0 个答案:

没有答案