在进行游戏开发时,需要自定义各种控件和界面。

自定义View的使用:

  • 绘制屏幕
  • 刷新屏幕:后台数据发生了变化,需要开发人员自己刷新屏幕以显示最新数据

例子:

MyView开发,绘制界面View内容:

package com.sunny;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;

public class MyView extends View {
    static final int ANGLE_MAX = 50;
    static final int SPEED = 4;
    static final int SCREEN_WIDTH = 480;
    static final int SCREEN_HEIGHT = 320;

static final int LEFT = 2;
    static final int RIGHT = 0;
    static final int UP = 3;
    static final int DOWN = 1;

int angle = 30;
    int angleChange = 3;
    int radius = 16;
    int centerX = radius;
    int centerY = radius;
    long timeStamp = System.currentTimeMillis();

int currPhoto=0;
    int direction = RIGHT;
    Bitmap bmpMan;
    Bitmap[] bmpPhotos;
    int[] imgIds = { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d };

public MyView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        bmpMan = BitmapFactory.decodeResource(getResources(), R.drawable.man);
        //System.out.println(bmpMan.getWidth());
        bmpPhotos = new Bitmap[imgIds.length];
        for (int i = 0; i < bmpPhotos.length; i++) {
            bmpPhotos[i] = BitmapFactory.decodeResource(getResources(),
                    imgIds[i]);
        }
    }

@Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub

Paint paint = new Paint();
        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(bmpMan, centerX - radius, centerY - radius, null);
        paint.setColor(Color.BLACK);
        paint.setAntiAlias(true);
        RectF oval = new RectF(centerX - radius - 1, centerY - radius - 2,
                centerX - radius - 1 + 2 * radius + 2, centerY - radius - 2 + 2
                        * radius + 4);
        canvas.drawArc(oval, 360-angle+90*direction, 2*angle, true, paint);
        if (System.currentTimeMillis() - timeStamp > 5000) {
            timeStamp = System.currentTimeMillis();
            currPhoto = (currPhoto + 1) % bmpPhotos.length;
        }
        canvas.drawBitmap(bmpPhotos[currPhoto], 80, 40, null);
        super.onDraw(canvas);
    }

}

MyThread线程主要控制View中元素的变化,及时刷新View信息:

package com.sunny;

public class MyThread extends Thread {
    int sleepSpan = 30;
    MyView myView;

public MyThread(MyView myView) {
        super();
        this.myView = myView;
    }

public void run() {
        while (true) {
            myView.angle += myView.angleChange;
            if (myView.angle > MyView.ANGLE_MAX) {
                myView.angleChange = -3;
            } else if (myView.angle < 0) {
                myView.angleChange = 3;
            }
            switch (myView.direction) {
            case MyView.RIGHT:
                myView.centerX = myView.centerX + myView.SPEED;
                break;
            case MyView.UP:
                myView.centerY = myView.centerY - myView.SPEED;
                break;
            case MyView.LEFT:
                myView.centerX = myView.centerX - myView.SPEED;
                break;
            case MyView.DOWN:
                myView.centerY = myView.centerY + myView.SPEED;
                break;
            }
            if (myView.centerY + myView.radius > MyView.SCREEN_HEIGHT) {
                myView.centerY = myView.centerY - MyView.SPEED;
                myView.direction = MyView.LEFT;
            }
            if (myView.centerY - myView.radius < 0) {
                myView.centerY = myView.centerY + MyView.SPEED;
                myView.direction = MyView.RIGHT;
            }
            if (myView.centerX + myView.radius > MyView.SCREEN_WIDTH) {
                myView.centerX = myView.centerX - MyView.SPEED;
                myView.direction = MyView.DOWN;
            }
            if (myView.centerX - myView.radius < 0) {
                myView.centerX = myView.radius;
                myView.direction = MyView.UP;
            }
            myView.postInvalidate();
            try {
                Thread.sleep(sleepSpan);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

在Activity中,创建View和后台线程:

public class mainActivity extends Activity {
    /** Called when the activity is first created. */
    MyView myView;
    MyThread mt;

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        myView = new MyView(this);
        setContentView(myView);
        mt = new MyThread(myView);
        mt.start();
    }
}

android 之 View的更多相关文章

  1. 深入理解 Android 之 View 的绘制流程

    概述 本篇文章会从源码(基于Android 6.0)角度分析Android中View的绘制流程,侧重于对整体流程的分析,对一些难以理解的点加以重点阐述,目的是把View绘制的整个流程把握好,而对于特定 ...

  2. Android自定义View 画弧形,文字,并增加动画效果

    一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类   B ...

  3. (转)[原] Android 自定义View 密码框 例子

    遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...

  4. Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...

  5. Android 自定义View (五)——实践

    前言: 前面已经介绍了<Android 自定义 view(四)-- onMeasure 方法理解>,那么这次我们就来小实践下吧 任务: 公司现有两个任务需要我完成 (1)监测液化天然气液压 ...

  6. Android 自定义 view(四)—— onMeasure 方法理解

    前言: 前面我们已经学过<Android 自定义 view(三)-- onDraw 方法理解>,那么接下我们还需要继续去理解自定义view里面的onMeasure 方法 推荐文章: htt ...

  7. Android 自定义 view(三)—— onDraw 方法理解

    前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...

  8. Android 自定义view(二) —— attr 使用

    前言: attr 在前一篇文章<Android 自定义view -- attr理解>已经简单的进行了介绍和创建,那么这篇文章就来一步步说说attr的简单使用吧 自定义view简单实现步骤 ...

  9. Android 自定义View

    Android 自定义View流程中的几个方法解析: onFinishInflate():从布局文件.xml加载完组件后回调 onMeasure() :调用该方法负责测量组件大小 onSizeChan ...

  10. Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法

    Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法 如下面所示,同时导入这两个,会提示其中一个与另一个产生冲突. 1i ...

随机推荐

  1. Linux--NiaoGe-Service-06

    Linux网络排错 思路: 硬件问题: 首先排除硬件故障,包括网线.Hub.Switch.Router.网卡.设备配置规则等等. 软件问题: 1.网卡的IP/Netmask设置错误 IP.Netmas ...

  2. iis日志存放位置 及 查看方法

    IIS:控制面板--管理工具--internet信息服务 网站的IIS日志是在空间里面看的.要登陆到空间里面的一个IIS日志里面看.IIS日志一般都很大的.看会有点.. 一.应用程序日志.安全日志.系 ...

  3. ACM学习大纲(转)

    1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...

  4. 剖析 Rails 3 MVC 中的数据传递

    引用链接:https://www.ibm.com/developerworks/cn/web/1108_linhx_rails3mvc/ 如果读者已经开发过基于 Rails 的应用,但对其 MVC 间 ...

  5. JDk安装及环境变量的配置

    一.JDK的安装 1.打开下载好的安装包(我在这里附上一个百度云连接,https://pan.baidu.com/s/1o3nx0kbmecAISeneGqykLQ    提取码:jnw6) 傻瓜式安 ...

  6. Java GUI 事件监听

    现在使用的仍是AWT的事件模型.涉及到3类对象: Event Source:事件源,即事件发生所在的组件 Event:事件,封装了此次事件的相关信息 Event Listener:事件监听器,监听事件 ...

  7. ReactiveCocoa 响应式函数编程

    简介 ReactiveCocoa(简称为RAC),RAC具有函数响应式编程特性,由Matt Diephouse开源的一个应用于iOS和OS X的新框架. 为什么使用RAC? 因为RAC具有高聚合低耦合 ...

  8. 在每天黄金时刻将数据库中数据获取包装成Excel表

    过程: 1.由Timer对象实现安排指定的任务在指定的时间进行重复的固定的延迟操作 a.设定时间间隔24小时:PERIOD_DAY = 24 * 60 * 60 * 100; b.指定每天执行操作的时 ...

  9. 【Web应用-迁移】迁移 Web 应用到新的应用服务计划的相关限制和说明

    现象描述 当前 Web 应用所在的应用服务计划和目标应用服务计划属于同一个资源组,但是通过 Portal 点击 “更改应用服务计划”,依旧看不到目标应用服务计划. 问题分析 导致上述问题的原因是,用户 ...

  10. vijos 1190 繁忙的都市

    描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路 ...