欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android中实现双缓冲(画板应用)和XML文件定义菜单

来源: 开发者 投稿于  被查看 5033 次 评论:20

Android中实现双缓冲(画板应用)和XML文件定义菜单


1.什么是双缓冲技术?双缓冲技术就是当用户操作界面完成后,会有一个缓冲区保存用户操作的结果。
 
为什么要使用双缓冲技术?拿Android 游戏开发来说,界面贞每次都是全部重画的,也就说画了新的,旧的就没了,所以需要使用双缓冲技术保存之前的内容。
 
如何实现双缓冲?使用一个Bitmap对象保留之前的画布即可。
 
查看源码打印?
01
package com.example.phonegaptest;
02
 
03
import android.content.Context;
04
import android.graphics.Bitmap;
05
import android.graphics.Bitmap.Config;
06
import android.graphics.Canvas;
07
import android.graphics.Color;
08
import android.graphics.Paint;
09
import android.graphics.Path;
10
import android.util.AttributeSet;
11
import android.view.MotionEvent;
12
import android.view.View;
13
 
14
public 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上的画布cacheCanvas
23
 
24
    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();
29
 
30
        path = new Path();
31
        cacheCanvas.setBitmap(cacheBitmap);
32
 
33
        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
    }
40
 
41
    @Override
42
    public boolean onTouchEvent(MotionEvent event) {
43
        float x = event.getX();
44
        float y = event.getY();
45
 
46
        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
    }
65
 
66
    @Override
67
    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
    }
73
 
74
}
 
 
 
 
 
2.XMl文件实现菜单功能
 
XMl文件如下:
[html] view plaincopy
<?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>    
 
主文件
[java] view plaincopy
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;    www.2cto.com
        case R.id.later:    
            Log.v(TAG, "------------laster");    
            break;    
        default:    
            break;    
        }    
        return super.onOptionsItemSelected(item);    
    }    
        
        
        
    
}    
 
 

相关文章

    暂无相关文章

用户评论