首先还是一贯作风,我们先看案例:

\

静态图看不出来效果,如果用过此软件(扎客)的同学们都知道,她的背景会动.怎么样,是不是觉得很时尚,起码比静态的要好(个人观点).其实实现起来并不复杂,这个如果让做游戏程序员做简直太小儿科了,这里我说明一点,其实我们做应用的也应该多少了解下游戏编程思维,起码对我们做应用有很好的帮助.

    下面我简单介绍下实现方式.
    实现原理:自定义一个SurfaceView控件.对之不停的onDraw,使得其背景动起来.
    对于SurfaceView如果不了解的同学们麻烦你先上网查找下,网上相关介绍很多.
    这里我简单介绍下其功能:首先这个控件是View的子类.好处就是可以在线程中(非UI线程)对UI进行更新.
MySurfaceView.java
package com.jj.dynamic;  

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback; public class MySurfaceView extends SurfaceView implements Callback, Runnable {
private Context mContext;
private SurfaceHolder surfaceHolder;
private boolean flag = false;// 线程标识
private Bitmap bitmap_bg;// 背景图 private float mSurfaceWindth, mSurfaceHeight;// 屏幕宽高 private int mBitposX;// 图片的位置 private Canvas mCanvas; private Thread thread; // 背景移动状态
private enum State {
LEFT, RINGHT
} // 默认为向左
private State state = State.LEFT; private final int BITMAP_STEP = ;// 背景画布移动步伐. public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
flag = true;
this.mContext = context;
setFocusable(true);
setFocusableInTouchMode(true);
surfaceHolder = getHolder();
surfaceHolder.addCallback(this);
} /***
* 进行绘制.
*/
protected void onDraw() {
drawBG();
updateBG();
} /***
* 更新背景.
*/
public void updateBG() {
/** 图片滚动效果 **/
switch (state) {
case LEFT:
mBitposX -= BITMAP_STEP;// 画布左移
break;
case RINGHT:
mBitposX += BITMAP_STEP;// 画布右移
break; default:
break;
}
if (mBitposX <= -mSurfaceWindth / ) {
state = State.RINGHT;
}
if (mBitposX >= ) {
state = State.LEFT;
}
} /***
* 绘制背景
*/
public void drawBG() {
mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);// 清屏幕.
mCanvas.drawBitmap(bitmap_bg, mBitposX, , null);// 绘制当前屏幕背景
} @Override
public void run() {
while (flag) {
synchronized (surfaceHolder) {
mCanvas = surfaceHolder.lockCanvas();
onDraw();
surfaceHolder.unlockCanvasAndPost(mCanvas);
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} } @Override
public void surfaceCreated(SurfaceHolder holder) { mSurfaceWindth = getWidth();
mSurfaceHeight = getHeight();
int mWindth = (int) (mSurfaceWindth * / );
/***
* 将图片缩放到屏幕的3/2倍.
*/
bitmap_bg = BitmapUtil.ReadBitmapById(mContext, R.drawable.hypers_bg,
(int) mWindth, (int) mSurfaceHeight); thread = new Thread(this);
thread.start(); } @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) { } @Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
} }
上诉代码相当简单,我也不过多介绍.相信大家都看得懂.
下面是我们只需要在Main.xml中引用即可.
<?xml version="1.0" encoding="utf-8"?>
<com.jj.dynamic.MySurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" > </com.jj.dynamic.MySurfaceView>

这个的效果图我就不展示了.就是一个时时变动的背景图片,下面我展示下我最近在开发的一个内部小型项目,针对开年会娱乐场所用的.(里面东西都是会动的.)看是简单我加了好多动画特效,做这个页面花了我一个星期呢.

怎么样,看起来还不错吧.其实我只是想说明一点.我们应用中完全可以把游戏融入进去,这样我们可以得到另一番景象,不过话说回来,这样也会带来相应的负面影响,因为都是画上去的,所以工作量也会翻倍.总之根据自己需要来开发就好了.
下面我上传下APK,大家可以下载安装下看看,说不定你可以从中找到灵感.
HypersParty.apk
下面我们再看一个页面:
我想说明的是这个密码后面的EditText的问题,要加上去很简单,我们直接可以通过布局搞定,下面我们看布局文件
这里我没有上布局文件代码,是因为我觉得看这个视图更好理解一点,不是么,有很多一上来就把布局文件啪啦啪啦贴出来,还得读取半天.
我说下诡异问题.看下面张图片:
这张图片是我点击键盘后让键盘小时候的结果(注:此时软键盘可以遮挡输入框).其实如果你再次点击edittext,其实它还在原位,只是 surfaceView在绘制的时候影响到了,原因不明.(下面我说个更诡异的问题,真是一个接一个,弄的我有想摔手机的心都有了.我的测试机是华为 S8600,android2.3的,然后我用oppo手机android4.0测试的时候用截图工具竟然截不出来上面这张bug图片,手机助手显示是 OK,但是手机上显示是BUG,NND,当时郁闷的要死,不管了这也不是重点.)
解决方法很简单:我们只需要在我们的activity中执行这段话就ok了.(同样适用于自定义的dialog.)
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
| WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
网上有的说可以在配置文件中配置,可是我配置了竟然无动于衷.大家可以去研究研究,总之代码这种方案可行.
效果图:
问题又出来了,看着怎么这么别扭呢,为什么密码跑了那么高呢?
这个问题没有解决,希望同学们有解决方案的朋友们麻烦告知下,(尝试多次不行,个人感觉系统是以edittext为对象,将之弹起,中间的距离和edittext本身在布局中的位置有关,如果在底部的话,那么正好在键盘的上面)。
有文章说   getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); 这句话可以解决,可惜试了试不尽人意.
 总之看着还说的过去,临时就这样了,昨天在群里问了问,有朋友们提出,弄一个透明的dialog,activity,想想虽然没有这么搞的,但是确实可行,只要你处理得好,根本看不出来他们不是一个布局.
 最后简单说明一点:其实在surfaceView中一般不需要加edittext控件的,比如说游戏,即使要的话,也会弹出一个性感的dialog.在其中加载控件(尤其是edittext)几乎就不会有这样的需求,即使有了,我们换个思维实现就OK了.
   
 

Android 动态背景的实现以及SurfaceView中添加EditText控件的更多相关文章

  1. TWaver初学实战——如何在TWaver属性表中添加日历控件?

    在日期输入框中添加日历控件,是一种非常流行和实用的做法.临渊羡鱼不如退而写代码,今天就看看在TWaver中是如何实现的.   资源准备   TWaver的在线使用文档中,就有TWaver Proper ...

  2. VC中添加web控件的方法

    在VC中使用WebBrowser控件的两方法 黄森堂(vcmfc)著 ClassWizard方式: 1.创建包装类:View->ClassWizard->Add Class->For ...

  3. 如何在VS2010中添加ActiveX控件及使用方法

    方法1: 1.首先在在项目上面右击添加类,如下图所示: 2.点击添加ActiveX控件中的MFC类 3.找到需要添加的ActiveX类. 4.点击完成即可. 5.此时转到资源视图,打开如下视图.可能工 ...

  4. Android 动态的给Button、TextView、ImageView等控件设置了background后,再设置padding属性时该属性不起作用

    也许大家遇到这样一个问题,有时我们根据业务需要在一个ViewGroup中动态的(程序运行过程中)添加View.例如添加Button,就需要给Button添加background.padding.mar ...

  5. 在xib中添加手势控件后运行可能会出现的错误

    如果出现错误: // -[UITapGestureRecognizer superview]: unrecognized selector sent to instance 0x8e407a0 // ...

  6. C# WinForm中添加用户控件

    转:https://blog.csdn.net/haelang/article/details/40681003 有的时候我们需要频繁使用一些系统默认工具的组合,那么就可以使用自定义用户控件. 起一个 ...

  7. 在工作表左侧中添加TreeView控件

    开发环境基于VSTO:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. 需求是在sheet的左侧停靠System.Windows.Forms.TreeV ...

  8. 如何在vs2010中添加Picture控件

    1.新建项目,并在对话框控件中拖入picture控件,并做如下设置 2.在picture控件的属性栏需要进行如下修改:ID需要修改,不能为static ID是控件的唯一标识,PictureCtrl(p ...

  9. worklight 中添加时间控件

    在我们使用worklight开发的过程中,由于文档的不开源和插件的缺少,总是自己琢磨很多东东,更有胜者 需要调用源代码实现某些不易实现的功能.在这里把实现的功能代码贴出来,如有不足之处还望指正! 实现 ...

随机推荐

  1. MS SQLserver数据库安装

    SQL2008的安装 1,双击打开setup安装文件 2,点击“全新安装或向现有安装添加功能” 3,安装程序支持规则,安装完之后,点击确定 4,输入产品的密钥,点击下一步 5,弹出“安装程序支持文件” ...

  2. sql server 查询字符串指定字符出现的次数

    这里提取指定符串"A"在字段中的出现次数SQL为: select len(keyword)-len(replace(keyword, 'A', ' ')) from 表 原理:用r ...

  3. 永久设置 NLS_DATE_FORMAT 方法

    在客户端(如WEB服务器),设置环境变量即可,如: NLS_DATE_FORMAT YYYY-MM-DD HH24:MI:SS   在程序处执行会影响后续SQL性能 ALTER SESSION SET ...

  4. java取随机数

    一, 指定的特定几个数据集合里按“随机顺序”全部取出 一碰到随机, 可能第一个想到的是用Math.Random() 来处理, 其实java本身提供了现成的类 通过 “打乱顺序”来处理“随机”问题 方法 ...

  5. asp:保留两位小数:

    <%=Formatnumber(-6665.8999,3,-1,-1,0)%>(6665.900)一个例子用到了函数Formatnumber()的所有参数:第一个参数(-6665.8999 ...

  6. 文件上传~Uploadify上传控件

    对于文件上传来说,有很多种实现方式,如传统的表单方式,现在流行的flash方式,甚至还有纯JS方式,之所以有这些方式来实现文件上传,我想主要原因是因为,传统的上传对于大文件支持不够,因为它是单线程同步 ...

  7. keepalived+haproxy-部署高可用负载均衡

    环境: 准备两台机子,安装haproxy及keepalive都一样,只是配置不一样而已. 这里只说明一台机子上安装haproxy及keepalive. ======================== ...

  8. power designer

    概述 Power Designer 是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,他几乎包括了数据库模型设计的全过程.利用Power Designer可以制作数据流程 ...

  9. CSS3 基本知识

    1.CSS3 简介 CSS 指层叠样式表 (Cascading Style Sheets),用于控制网页的样式和布局,CSS3 是最新的 CSS 标准. 在网页制作时采用层叠样式表,可以有效的对页面的 ...

  10. MySQL中SQL语句的分类

    1:数据定义语言(DDL) :创建和删除数据库(CREATE DATABASE || DROP  DATABASE):2:创建.修改.重命名.删除表(CREATE  TABLE || ALTER TA ...