常常在开发过程中使用自定义的View,而自定义的View的图形往往是onDraw里面实现的,这样就可能因为在父容器里面而因为父容器稍微的变更,就会重绘,重绘是需要很多内存消耗的,而且如果父容器有背景色,那么onDraw所画的一切图形色彩都是再父容器的基础上进行,从而导致某一个像素点上,进行了多次渲染,这是需要内存消耗的.专家的建议是:
我们可以先按照通常的方式把View上的元素按照从后到前的方式绘制出来,但是不直接显示到屏幕上,而是使用GPU预处理之后,再又GPU渲染到屏幕上,GPU可以对界面上的原始数据直接做旋转,设置透明度等等操作。使用GPU进行渲染,虽然第一次操作相比起直接绘制到屏幕上更加耗时,可是一旦原始纹理数据生成之后,接下去的操作就比较省时省力。
个人觉得GPU就像一个相机,将View的图形在第一次渲染的时候拍下来,生成一个底片,下次再视图更新的时候,要显示自定义的View,GPU就把底片冲洗一下,贴出来,就不需要再去重新绘制了,这样就节省了很多内存消耗:
具体操作事例如下:
<1> : 新建一个Android工程:
<2> : 具体程序如下:
DurianMainActivity.java
package org.durian.duriangpuview; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ListView; import java.util.List; public class DurianMainActivity extends ActionBarActivity { private ListView listView; private Button button; private DurianBaseAdapter mDurianBaseAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.durian_main); listView=(ListView)findViewById(android.R.id.list); listView.setBackgroundColor(Color.GRAY); mDurianBaseAdapter=new DurianBaseAdapter(this); listView.setAdapter(mDurianBaseAdapter); button=(Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDurianBaseAdapter.notifyDataSetChanged(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_durian_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so