Android中实现双缓冲(画板应用)和XML文件定义菜单
1.什么是双缓冲技术?双缓冲技术就是当用户操作界面完成后,会有一个缓冲区保存用户操作的结果。
为什么要使用双缓冲技术?拿Android 游戏开发来说,界面贞每次都是全部重画的,也就说画了新的,旧的就没了,所以需要使用双缓冲技术保存之前的内容。
如何实现双缓冲?使用一个Bitmap对象保留之前的画布即可。
查看源码打印?01package com.example.phonegaptest;0203import android.content.Context;04import android.graphics.Bitmap;05import android.graphics.Bitmap.Config;06import android.graphics.Canvas;07import android.graphics.Color;08import android.graphics.Paint;09import android.graphics.Path;10import android.util.AttributeSet;11import android.view.MotionEvent;12import android.view.View;1314public class DrawView extends View {15 float preX;16 float preY;17 private Path path;18 public Paint paint = null;19 final int VIEW_WIDTH = 320;20 final int VIEW_HEIGHT = 480;21 Bitmap cacheBitmap = null;//定义一个内存中的图片,这张图片会作为缓冲区22 Canvas cacheCanvas = null;//定义cacheBitmap上的画布cacheCanvas2324 public DrawView(Context context, AttributeSet set) {25 super(context, set);26 cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT,27 Config.ARGB_8888);//创建缓冲区28 cacheCanvas = new Canvas();2930 path = new Path();31 cacheCanvas.setBitmap(cacheBitmap);3233 paint = new Paint(Paint.DITHER_FLAG);34 paint.setColor(Color.RED);35 paint.setStyle(Paint.Style.STROKE);36 paint.setStrokeWidth(1);37 paint.setAntiAlias(true);38 paint.setDither(true);39 }4041 @Override42 public boolean onTouchEvent(MotionEvent event) {43 float x = event.getX();44 float y = event.getY();4546 switch (event.getAction()) {47 case MotionEvent.ACTION_DOWN:48 path.moveTo(x, y);49 preX = x;50 preY = y;51 break;52 case MotionEvent.ACTION_MOVE:53 path.quadTo(preX, preY, x, y);54 preX = x;55 preY = y;56 break;57 case MotionEvent.ACTION_UP:58 cacheCanvas.drawPath(path, paint);59 path.reset();60 break;61 }62 invalidate();63 return true;//返回true表明处理方法已经处理该事件,该事件不会扩散64 }6566 @Override67 protected void onDraw(Canvas canvas) {68 super.onDraw(canvas);69 Paint bmpPaint = new Paint();70 canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint);71 canvas.drawPath(path, paint);72 }7374}<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/close" android:icon="@drawable/ic_launcher" android:orderInCategory="3" android:title="Close"/> <item android:id="@+id/no_icon" android:orderInCategory="2" android:title="Sans Icon"/> <item android:id="@+id/disabled" android:enabled="true" android:orderInCategory="4" android:title="Disabled"/> <!-- orderInCategory表示的是item的排序--> <group android:id="@+id/other_stuff" android:menuCategory="secondary" android:visible="true" > <item android:id="@+id/later" android:orderInCategory="0" android:title="2nd-To-Last"/> <item android:id="@+id/last" android:orderInCategory="1" android:title="Last"/> </group> <!--表示的是二级菜单--> <item android:id="@+id/submenu" android:orderInCategory="3" android:title="A Submenu"> <menu> <item android:id="@+id/non_ghost" android:alphabeticShortcut="n" android:title="Non-Ghost" android:visible="true"/> <item android:id="@+id/ghost" android:alphabeticShortcut="g" android:title="A Ghost" android:visible="true"/> </menu> </item> </menu>
package com.example.receiveractivity;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem; public class ReceiverActivity extends Activity { /** Called when the activity is first created. */ private static final String TAG="BruceZhang"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_receiver); } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub MenuInflater mflater=new MenuInflater(this); mflater.inflate(R.menu.activity_receiver, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch(item.getItemId()){ case R.id.close: Log.v(TAG, "------------close"); break; case R.id.no_icon: Log.v(TAG, "------------noicon"); break; case R.id.submenu: Log.v(TAG, "------------submenu"); break; case R.id.non_ghost: Log.v(TAG, "------------non_ghost"); break; case R.id.ghost: Log.v(TAG, "------------ghost"); break; case R.id.disabled: Log.v(TAG, "------------disabled"); break; case R.id.last: Log.v(TAG, "------------last"); break; case R.id.later: Log.v(TAG, "------------laster"); break; default: break; } return super.onOptionsItemSelected(item); } }