`
rayln
  • 浏览: 424349 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SurfaceView的使用例子

 
阅读更多
转载自: http://blog.csdn.net/hellogv/article/details/5985090

效果图:


例子:
main.xml
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent" android:layout_height="fill_parent"  
    android:orientation="vertical">  
  
    <LinearLayout android:id="@+id/LinearLayout01"  
        android:layout_width="wrap_content" android:layout_height="wrap_content">  
        <Button android:id="@+id/Button01" android:layout_width="wrap_content"  
            android:layout_height="wrap_content" android:text="简单绘画"></Button>  
        <Button android:id="@+id/Button02" android:layout_width="wrap_content"  
            android:layout_height="wrap_content" android:text="定时器绘画"></Button>  
    </LinearLayout>  
    <SurfaceView android:id="@+id/SurfaceView01"  
        android:layout_width="fill_parent" android:layout_height="fill_parent"></SurfaceView>  
</LinearLayout>



SurfaceviewActivity.java
package com.surface;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

public class SurfaceviewActivity extends Activity {
	/** Called when the activity is first created. */  
    Button btnSimpleDraw, btnTimerDraw;  
    SurfaceView sfv;  
    SurfaceHolder sfh;  
  
    private Timer mTimer;  
    private MyTimerTask mTimerTask;  
    int Y_axis[],//保存正弦波的Y轴上的点  
    centerY,//中心线  
    oldX,oldY,//上一个XY点   
    currentX;//当前绘制到的X轴上的点  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
  
        btnSimpleDraw = (Button) this.findViewById(R.id.Button01);  
        btnTimerDraw = (Button) this.findViewById(R.id.Button02);  
        btnSimpleDraw.setOnClickListener(new ClickEvent());  
        btnTimerDraw.setOnClickListener(new ClickEvent());  
        sfv = (SurfaceView) this.findViewById(R.id.SurfaceView01);  
        sfh = sfv.getHolder();  
  
        //动态绘制正弦波的定时器  
        mTimer = new Timer();  
        mTimerTask = new MyTimerTask();  
  
        // 初始化y轴数据  
        centerY = (getWindowManager().getDefaultDisplay().getHeight() - sfv  
                .getTop()) / 2;  
        Y_axis = new int[getWindowManager().getDefaultDisplay().getWidth()];  
        for (int i = 1; i < Y_axis.length; i++) {// 计算正弦波  
            Y_axis[i - 1] = centerY  
                    - (int) (100 * Math.sin(i * 2 * Math.PI / 180));  
        }  
    }  
  
    class ClickEvent implements View.OnClickListener {  
  
        @Override  
        public void onClick(View v) {  
  
            if (v == btnSimpleDraw) {  
                SimpleDraw(Y_axis.length-1);//直接绘制正弦波  
              
            } else if (v == btnTimerDraw) {  
                oldY = centerY;  
                mTimer.schedule(mTimerTask, 0, 5);//动态绘制正弦波  
            }  
  
        }  
  
    }  
  
    class MyTimerTask extends TimerTask {  
        @Override  
        public void run() {  
  
            SimpleDraw(currentX);  
            currentX++;//往前进  
            if (currentX == Y_axis.length - 1) {//如果到了终点,则清屏重来  
                ClearDraw();  
                currentX = 0;  
                oldY = centerY;  
            }  
        }  
  
    }  
      
    /* 
     * 绘制指定区域 
     */  
    void SimpleDraw(int length) {  
        if (length == 0)  
            oldX = 0;  
        Canvas canvas = sfh.lockCanvas(new Rect(oldX, 0, oldX + length,  
                getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布  
        Log.i("Canvas:",  
                String.valueOf(oldX) + "," + String.valueOf(oldX + length));  
  
        Paint mPaint = new Paint();  
        mPaint.setColor(Color.GREEN);// 画笔为绿色  
        mPaint.setStrokeWidth(2);// 设置画笔粗细  
  
        int y;  
        for (int i = oldX + 1; i < length; i++) {// 绘画正弦波  
            y = Y_axis[i - 1];
            System.out.println("oldX:"+oldX+"    oldY:"+oldY+"   i:"+i+"    y:"+y);
            canvas.drawLine(oldX, oldY, i, y, mPaint);  
            oldX = i;  
            oldY = y;  
        }  
        sfh.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像  
    }  
  
    void ClearDraw() {  
        Canvas canvas = sfh.lockCanvas(null);  
        canvas.drawColor(Color.BLACK);// 清除画布  
        sfh.unlockCanvasAndPost(canvas);  
  
    }
}
分享到:
评论

相关推荐

    SurfaceView使用示例

    下面我们将详细讲解SurfaceView的使用以及在实现一个绘图板时的关键知识点。 首先,SurfaceView包含两个主要组成部分:Surface和View。Surface是实际用于绘图的后台缓冲区,而View则负责管理Surface在屏幕上的显示...

    surfaceView用法例子

    下面是一个简单的SurfaceView使用例子: 首先,创建一个继承自SurfaceView的类,并实现SurfaceHolder.Callback接口: ```java public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback...

    SurfaceView小例子

    在绘制过程中,SurfaceView会使用两个Surface,一个用于显示,一个用于绘图。当一个Surface完成绘制并交换到前台显示时,另一个Surface则可以开始新的绘图,这样可以避免闪烁,提高用户体验。 总的来说,这个...

    android surfaceView 双缓冲

    android使用双缓冲辨析及surfaceview使用例子

    surfaceView小例子

    通过学习这个小例子,你可以深入了解SurfaceView的工作原理,掌握如何在Android应用中高效地使用SurfaceView进行图形绘制,为你的应用程序带来更流畅的视觉体验。同时,这个例子也为你提供了一个基础模板,可以在此...

    SurfaceView

    文件名`szt_SurfaceView`可能包含的是一个关于SurfaceView使用示例的代码或文档,通过学习和分析这个例子,可以更好地理解和掌握SurfaceView在实际项目中的运用。 总之,SurfaceView是Android游戏开发中的重要工具...

    Android中SurfaceView截屏

    这个例子展示了如何结合`SurfaceView`和其下的视图,生成一张完整的截图。记住,实际应用中可能需要根据具体的布局和需求进行调整。 总结来说,截取`SurfaceView`的内容需要绕过默认的截图机制,通过直接操作`...

    SurfaceView视频播放功能

    总的来说,这个SurfaceView视频播放功能的例子涵盖了Android中视频播放的基础技术,包括SurfaceView的使用、MediaPlayer的管理、网络流媒体处理,以及可能的用户体验优化。对于想要在Android应用中实现高效视频播放...

    使用SurfaceView做视频录制的小例子

    使用SurfaceView做视频录制的小例子

    SurfaceView中添加Animation

    在这个例子中,我们可能使用的是View Animation,因为SurfaceView通常需要兼容低版本Android设备。 1. **定义Animation** 创建一个Animation可以通过XML资源文件或代码实现。例如,我们可以创建一个平移动画,通过...

    android SurfaceView游戏框架

    开发者可以通过查看这个例子学习如何结合SurfaceView和游戏逻辑来构建自己的游戏框架。 通过理解和熟练运用SurfaceView,开发者可以创建出高性能、流畅的游戏体验,满足用户对于游戏画质和响应速度的需求。同时,...

    Android圆形相机预览窗口,圆形SurfaceView

    这个例子可以帮助开发者调试和测试自定义SurfaceView的交互功能。 总结起来,实现Android圆形相机预览窗口需要对SurfaceView有深入的理解,包括如何自定义视图、绘制路径以及与相机的交互。通过这个过程,开发者...

    安卓Android源码——安卓Android使用SurfaceView实现墨迹天气的风车效果.zip

    在安卓应用开发中,SurfaceView ...总之,通过理解SurfaceView的工作机制,我们可以利用其特性实现高性能的图形绘制,如这个例子中的风车效果。通过不断学习和实践,开发者可以创造出更多富有创意和互动性的安卓应用。

    使用surfaceView制作的拍照demo

    在这个例子中,我用代码制作了一个拍摄界面,里面只有三个控件,一个是自己封装的CameraView,它继承了SurfaceView,一个是悬浮在CameraView上的按 钮,点击它可以捕捉画面并把图像存储到sdCard的根目录下,还有一个...

    android传感器和surfaceview的使用

    该资源是一个完整的android项目,主要是利用surfaceview和android的重力传感器实现自由落体的模拟,包括碰撞和瞬间改变重力加速度的方向等。该案例是我模拟物理引擎的一个例子,主要是参照“动量守恒定律”和“动能...

    SurfaceView入门Demo

    7. **Demo实践**:"SurfaceView入门Demo"可能包含了一个简单的例子,如在一个空白的Surface上绘制动画或者播放视频。通过分析这个Demo,你可以看到如何创建和管理绘图线程,以及如何在Surface上进行基本的绘图操作。...

    anroid使用surfaceView画不停移动的圆形

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行高性能的图形绘制,常用于视频播放...在这个例子中,你可以根据自己的需求调整圆形的运动轨迹、速度和颜色,以创造出各种动态视觉效果。

    解决SurfaceView设置透明造成覆盖其他组件的替代方案

    1. **使用TextureView**:替换SurfaceView为TextureView,因为TextureView可以轻松地嵌入到布局中,且支持透明度。 2. **设置透明度**:通过修改TextureView的背景颜色或使用Alpha通道来实现透明效果。 3. **处理...

    Android多媒体功能开发-使用SurfaceView和MediaPlayer播放视频的例子

    将SurfaceView与MediaPlayer结合使用时,需要设置MediaPlayer的SurfaceHolder,以便将视频渲染到SurfaceView上。通常我们会在SurfaceView的回调方法`surfaceCreated()`和`surfaceDestroyed()`中分别调用MediaPlayer...

    SurfaceView做的推箱子源代码

    3. **SurfaceView的使用** - 绘制逻辑:在SurfaceView的绘制回调中,开发者需要根据游戏状态绘制地图、玩家和箱子的图像。 - 更新机制:利用SurfaceHolder的callback方法,如`surfaceCreated()`、`surfaceChanged...

Global site tag (gtag.js) - Google Analytics