android 动态背景的实现以及SurfaceView中添加EditText控件

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

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

下面我简单介绍下实现方式.

实现原理:自定义一个SurfaceView控件.对之不停的onDraw,使得其背景动起来.

对于SurfaceView如果不了解的同学们麻烦你先上网查找下,网上相关介绍很多.

这里我简单介绍下其功能:首先这个控件是View的子类.好处就是可以在线程中(非UI线程)对UI进行更新.

MySurfaceView.java

[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 = 1;// 背景画布移动步伐.

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 / 2) {

state = State.RINGHT;

}

if (mBitposX >= 0) {

state = State.LEFT;

}

}

/***

* 绘制背景

*/

public void drawBG() {

mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);// 清屏幕.

mCanvas.drawBitmap(bitmap_bg, mBitposX, 0, null);// 绘制当前屏幕背景

}

@Override

public void run() {

while (flag) {

synchronized (surfaceHolder) {

mCanvas = surfaceHolder.lockCanvas();

onDraw();

surfaceHolder.unlockCanvasAndPost(mCanvas);

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

mSurfaceWindth = getWidth();

mSurfaceHeight = getHeight();

int mWindth = (int) (mSurfaceWindth * 3 / 2);

/***

* 将图片缩放到屏幕的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中引用即可.

[java]

<?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.)

[java]

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控件

时间: 2024-10-12 15:10:05

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

Android开发中给EditText控件添加TextWatcher监听实现对输入字数的限制

做这个功能是因为开发项目的时候,由于后台接口的一些参数的值的长度有要求,不能超过多少个字符,所以在编辑框中输入的字符是要有限制的. 下面就来看一下demo的实现过程: 首先,在xml控件中放置一个EditText控件,然后初始化该控件并对该控件添加文本监听.xml自己简单的设计一下,代码较为简单,直接上代码: package com.example.edittext; import android.app.Activity; import android.os.Bundle; import an

JScrollPane控件中添加其他控件的问题&&JScrollPane设置滚动条&&调整滚动速度

如果要在JScrollPane控件中添加其他控件,不能用下面这种方法 JScrollPane j = new JScrollPane();j.add(new JButton("点击")); 只能通过以下方法添加 JScrollPane j = new JScrollPane(new JButton("点击")); 或者 JScrollPane j = new JScrollPane();j.getViewport().add(new JButton("点击

IOS之导航栏中添加UITextView控件bug

今天遇到一个奇怪的问题,如下: 在导航栏控制器的rootviewcontroller中,添加了一个UITextView控件,代码如下: - (void)viewDidLoad { [super viewDidLoad]; self.title =@"Test"; UITextView *textview = [[UITextViewalloc]init]; textview.frame = CGRectMake(10, 100, 300, 200); textview.backgrou

VC中添加web控件的方法

在VC中使用WebBrowser控件的两方法 黄森堂(vcmfc)著 ClassWizard方式: 1.创建包装类:View->ClassWizard->Add Class->Form a Type Library->C:\winnt\system32\shdocvw.dll->只选择IWebBrowserApp类->OK->OK 2.声明一个类变量:IWebBrowserApp m_internetexplorer;,并包含刚才的头文件(xxx.h) 3.在类的

worklight 中添加时间控件

在我们使用worklight开发的过程中,由于文档的不开源和插件的缺少,总是自己琢磨很多东东,更有胜者 需要调用源代码实现某些不易实现的功能.在这里把实现的功能代码贴出来,如有不足之处还望指正! 实现的步骤就不多说了,上篇中已经解说 实现日期插件 1 public class DatePickerPlugin extends CordovaPlugin { 2 3 private static final CordovaActivity ctx = null; 4 private static

005.使用百度SDK写hello baidumap时,在布局xml文件中添加地图控件时;提示&#39;clickable&#39; attribute found, please also add &#39;focusable&#39; 错误

0.报错&提示信息: 'clickable' attribute found, please also add 'focusable'  A widget that is declared to be clickable but not declared to be focusable is not accessible via the keyboard. Please add the focusable attribute as well. 1.原因: 一个控件,如果没有定义focusable

Fragment中添加spinner控件问题

今天编写Android程序,遇到一个问题: fragment是activity的一部分,具有高度的自由性.我编写了一个Fragment程序,在其中添加了Spinner控件(就是普通的添加方式),但是就是运用ArrayAdapter进行数据绑定的时候 ArrayAdapter<String>(View,int,String)中的View类型参数,并不能用常用的this来代替.必须用getActivity().getBaseContext()来代替. 下面来说明一下具体的原因: this应用上下文

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

开发环境基于VSTO:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. 需求是在sheet的左侧停靠System.Windows.Forms.TreeView控件,实现类似资源浏览器的效果,另外,tree节点使用自定义的图标,支持复选框. 首先准备好树节点的图标,使用visual studio 2010自带的图标可以省去很多麻烦(在安装目录\Common7\VS2010ImageLibrary).我挑选了4个16x16大小的图标拷贝到vsto工程下

解决UIScrollView中添加子控件出现“UIScrollView Scrollable Content Size Ambiguity”的办法

来自StackOverflow的帖子,原文见这里. So I just sorted out in this way: Add in the UIScrollView a UIView (we can call that contentView); In this contentView, set top, bottom, left and right margins to 0 (of course from the scrollView which is the superView); Set