Expert的View——SurfaceView

SurfaceView 用于要求界面更新迅速的UI,能够更自主的定义界面!通常作为2D游戏开发的首选。它与View有相似地方,但也有区别!

SurfaceView的基本用法:

1。为了实现代码的方便管理且不混乱,最好继承SurfaceView并且实现SurfaceHolder.Callback接口,如下

public class MySurfView extends SurfaceView implements SurfaceHolder.Callback {

    public MySurfView(Context context) {
        super(context);
        init(context);

    }

    public MySurfView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);

    }

    public MySurfView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);

    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public MySurfView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context);
    }
    private SurfaceHolder surfaceHolder;
    private Paint paint;
    private Context context;
    private void init(Context context){
      surfaceHolder=this.getHolder();
        surfaceHolder.addCallback(this);
       paint=new Paint();
        this.context=context;
        paint.setColor(Color.BLUE);
    }

   //<span style="font-family: Arial, Helvetica, sans-serif;">实现SurfaceView界面的绘制</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<span style="font-family: Arial, Helvetica, sans-serif;">  private void drawCanvas(){</span>
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    drawCanvas();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }<span style="font-family: Arial, Helvetica, sans-serif;">   </span>
<span style="font-family: Arial, Helvetica, sans-serif;">//通过MotionEvent获取x,y的坐标,实现SurfaceView界面的区域点击事件</span>
   
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">@Override public boolean onTouchEvent(MotionEvent event) { return true; }}</span>

2.还可以通过实例化一个SurfaceView,并且获取该SurfaceView的SurfaceHolder对象,之后给该SurfaceView赋值SurfaceHolder.CallBack,如下:

   private SurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MySurfView(this));
        surfaceView= (SurfaceView) findViewById(R.id.surfaceView);
        surfaceHolder=surfaceView.getHolder();
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {

            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
        });

    }

SurfaceView如何绘制:

前面提到过SurfaceView的界面绘制是从surfaceCreated(SurfaceHolder holder)方法开始进行的,通过SurfaceHolder获取Canvas对象,绘制完成后释放并提交该对象,如下代码:

 private void oneTest(){
        Canvas canvas=surfaceHolder.lockCanvas();//获取SurfaceView的画布
        // 这部分代码为   画布的绘制部分
     surfaceHolder.unlockCanvasAndPost(canvas);//绘制完成后,释放画布Canvas</span>
    }

SurfaceView的事件监听:

SurfaceView类是继承MockView的子类,MockView继承了TextView,因此SurfaceView也拥有View的事件,但SurfaceView也会有它自己的事件特性,如果想监听SurfaceView的某一块区域点击事件,首先需要判断该触摸点是否在该区域中,如果在则触发该区域的事件!如下所示:

    private         Region region=new Region();
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        /**
         * 点击事件
         */
        if (region.contains( (int)event.getX(), (int)event.getY())){

            Toast.makeText(context,"区域部分",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(context,"not  区域部分",Toast.LENGTH_SHORT).show();

        }
        return true;
    }

上面示例的Region在绘制SurfaceView时必须设定其区域范围,区域范围的定制问题立马探讨!

SurfaceView的区域定制:

1.使用Region来确定区域:下述代码是绘制一个矩形,设定Region的范围

      region.op(new Rect(0,0,300,100), Re     gion.Op.XOR);
        canvas.clipRegion(region);

2,使用坐标来进行计算,设备的左上角为(0,0)起点,向右为x轴正方向,向下为Y轴正方向,横竖屏切换时亦是如此!通过划定区域的坐标界限来确定触摸点是否在划定区域内!

时间: 2024-10-24 07:14:24

Expert的View——SurfaceView的相关文章

能够在子线程绘画的View SurfaceView

转载请注明出处:王亟亟的大牛之路 近期两天都没有写文章,一方面是自己在看书.一方面不知道写什么,本来昨天想写Glide或者RxAndroid的东西结果公司的"狗屎"网怎么都刷不好Gradle我也是无语了(FQ也没用).准备今天背着笔记本 回家搞.真是服了.. 抱怨的话不说了,来看下这一篇要讲的主角 SurfaceView,关于SurfaceView的文章事实上在别的一些网站上也有,由于我之前没写过,所以也就一直没整这部分的内容(别人写的好坏反正找好的点自己吸收吧,嘿嘿) 问题:Surf

view+SurfaceView实现条码扫描效果

效果图: 上半部分为一个显示摄像头拍摄到的情景的窗口及一条来回循环移动的线条,下半部分为一个无功能的Btn 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" androi

可以在子线程绘画的View SurfaceView

转载请注明出处:王亟亟的大牛之路 最近两天都没有写文章,一方面是自己在看书,一方面不知道写什么,本来昨天想写Glide或者RxAndroid的东西结果公司的"狗屎"网怎么都刷不好Gradle我也是无语了(翻墙也没用),准备今天背着笔记本 回家搞,真是服了.. 抱怨的话不说了,来看下这一篇要讲的主角 SurfaceView,关于SurfaceView的文章其实在别的一些站点上也有,因为我之前没写过,所以也就一直没整这部分的内容(别人写的好坏反正找好的点自己吸收吧,嘿嘿) 问题:Surfa

android: View, SurfaceView, GLSurfaceView, TextureView 区别与联系

区别与联系 View: 显示视图,内置画布,提供了图形绘制函数.触屏事件.按键事件函数等,必须在UI主线程内更新画面,速度较慢: SurfaceView: 基于view视图进行拓展的视图类,更适合2D游戏的开发,是view的子类,使用了双缓冲机制,即:允许在子线程中更新画面,所以刷新界面速度比view快. GLSurfaceView: 基于SurfaceView视图再次进行拓展的视图类,在SurfaceView基础上封装了EGL环境管理以及render线程,专用于3D游戏开发的视图.是Surfa

Android之View / SurfaceView / GLSurfaceView

Android游戏当中主要的除了控制类外就是显示类View.SurfaceView是从View基类中派生出来的显示类.android游戏开发中常用的三种视图是:view.SurfaceView和GLSurfaceView. View:显示视图,内置画布,提供图形绘制函数.触屏事件.按键事件函数等:必须在UI主线程内更新画面,速度较慢. SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发:是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view

Expert的View——StackView

StackView的使用效果: 使用方法: 在Xml布局文件中使用: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="m

Android之View和SurfaceView

Android游戏当中主要的除了控制类外就是显示类View.SurfaceView是从View基类中派生出来的显示类.android游戏开发中常用的三种视图是:view.SurfaceView和GLSurfaceView. View:显示视图,内置画布,提供图形绘制函数.触屏事件.按键事件函数等:必须在UI主线程内更新画面,速度较慢. SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发:是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view

【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)

1. SurfaceView 游戏框架实例 实例效果:就是屏幕上的文本跟着点击的地方移动,效果图如下: 步骤: 新建项目“GameSurfaceView”,首先自定义一个类"MySurfaceView",此类继承SurfaceView,并实现android.view.SurfaceHolder.Callback 接口,代码如下 package com.example.ex4_5; import android.content.Context; import android.graphi

基于android平台的模拟血压计实现(surfaceView的熟练使用)

这个是我根据上一篇文章的温度计改的血压计,因为客户对温度计还有血压计的需求是一样的,所以,我就选择了偷懒,直接用温度计的代码改了一概,就成了血压计的了 1 package com.example.test; 2 3 4 5 import android.content.Context; 6 import android.graphics.Bitmap; 7 import android.graphics.Canvas; 8 import android.graphics.Color; 9 imp