- 浏览: 327020 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jnssvh:
楼主,还发代码吗?jnssvh@aliyun.com
SurfaceView简单例子 -
hou_anne:
讲解的非常详细
Android TabActivity实现多页显示效果 -
小鱼小鹰:
现在还能吗。。。296252344@qq.com
自定义控件(SurfaceView与view结合) -
flyar:
你好!我按照你的代码实现多点广播,但是在一台机子休眠,另一台手 ...
UDP广播与多播简单实现 -
herber2010:
图有错误~~
java实现快速排序
自定义控件(SurfaceView与view结合)
作者:Legend
QQ:158067568
上一节小试牛刀,介绍了一个简单的SurfaceView的例子,如果用于实际开发,那还差得远呢。本节介绍SurfaceView与View结合使用的例子,SurfaceView部分与球类稍作改动,这里就不在赘述。主要介绍一下如何在View中成功的把SurfaceView添加进来,并且通过widget中默认的控件来操作自定义的SurfaceView。
View中添加SurfaceView
还记得我上一节中的SurfaceView类BallSurfaceView的构造方法么?BallSurfaceView(Context context)没错就是这个,但是如果我们要在view中添加,还是用这个构造方法就会报错。感谢mars老师的Android群,里面的大虾们帮我解决了这个问题。
其实只要使用如下构造方法,然后注意几点就ok了。
public BallSurfaceView(Context context, AttributeSet attrs) { super(context,attrs); …..
就是上面的构造方法,是符合view的。AttributeSet是提供一些设置的类,可以参考API。
但是值得注意的是,不要再SurfaceView中去绑定View,这样会带来意想不到的错误。
实现
我将把代码全部贴出,供大家参考。
package cn.edu.heut.zcl; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.SurfaceHolder; import android.view.SurfaceView; public class BallSurfaceView extends SurfaceView implements SurfaceHolder.Callback{ // SportActivity sportActivity ;//调用该SurfaceView的上下文引用 private Ball ball ;//小球 public static final int initX = 100; public static final int initY = 100; SurfaceHolder holder ; public int screenWidth ; public int screenHeight ; public BallSurfaceView(Context context, AttributeSet attrs) { super(context,attrs); ball = new Ball(initX, initY, this); holder = this.getHolder(); holder.addCallback(this); //获得屏幕尺寸 DisplayMetrics dm = new DisplayMetrics(); dm = context.getApplicationContext().getResources().getDisplayMetrics(); screenWidth = dm.widthPixels; screenHeight = dm.heightPixels; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(canvas == null) canvas = holder.lockCanvas();//锁定画布 Paint p = new Paint(); int c = p.getColor(); p.setColor(Color.WHITE);//设置背景白色 if(canvas != null) canvas.drawRect(0, 0, screenWidth, screenHeight, p); p.setColor(c); ball.onDraw(canvas); holder.unlockCanvasAndPost(canvas);//释放锁 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { new RefreshThread().start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { } public void setStop(){ ball.setStop(true); } public void setStart(){ ball.setStop(false); } public void setRestart(){ ball.setPosition(initX, initY); ball.setMaxHeight(initY); } private class RefreshThread extends Thread{ @Override public void run() { while(true){ Canvas canvas = null; try{ onDraw(canvas); }catch(Exception e){ e.printStackTrace(); } try { Thread.sleep(40); } catch (InterruptedException e) { e.printStackTrace(); } } } } } package cn.edu.heut.zcl; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.DisplayMetrics; /** * 球类 * @author zcl * */ public class Ball { /** * 球的高 */ public static final int HEIGHT = 93; /** * 球的宽 */ public static final int WIDTH = 93; private static final int STEPLENGTH = 10;//每次运动的间距 private static final float REDUCEPERCENTAGE = 0.35F;//递减系数 private int stepReduce ;//每次反向运动的缩短的距离 private boolean stop = false; public void setStop(boolean stop) { this.stop = stop; } private float runX ;//球的位置 private float runY ;//球的位置 private BallSurfaceView bsv ; private boolean upDirection = false;//if true,up direction,or is down direction private float maxHeight ;//当前运动最高的高度 private Paint paint ; Bitmap ballBitmap ;//球的图片 public Ball(float initX , float initY , BallSurfaceView bsv){ this.runX = initX; this.runY = initY ; maxHeight = initY; this.bsv = bsv; ballBitmap = BitmapFactory.decodeResource(bsv.getResources(), R.drawable.ball);//加载图片 paint = new Paint(); } public void onDraw(Canvas canvas) { int c = paint.getColor();//保存颜色,之后还原为之前颜色 if( !stop ) boundaryTest(); if(canvas != null) canvas.drawBitmap(ballBitmap,runX,runY,paint); paint.setColor(c); if( !stop ) move(); } /** * 运动 */ private void move() { if(maxHeight >= (bsv.screenHeight - HEIGHT)) { return; } if(upDirection){//向上 runY = runY + STEPLENGTH ; }else{ runY = runY - STEPLENGTH ; } } /** * 边界检测,使球不会飞出边界 */ private void boundaryTest(){ if(runY > bsv.screenHeight - HEIGHT){//向下运动到头 upDirection = !upDirection;//方向置反 runY = bsv.screenHeight - HEIGHT; stepReduce = (int) (maxHeight * REDUCEPERCENTAGE); maxHeight = maxHeight + stepReduce ;//最大高度递减 } if(runY < maxHeight ){//向上运动到头 upDirection = !upDirection;//方向置反 if(maxHeight >= (bsv.screenHeight - HEIGHT)) return; runY = maxHeight ; } } public void setPosition(float x,float y){ this.runX = x; this.runY = y; } public void setMaxHeight(float y){ this.maxHeight = y; } } package cn.edu.heut.zcl; import android.app.Activity; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Button; public class SportActivity extends Activity { Button butStop; Button butStart; Button butRestart; BallSurfaceView bsv ; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // bsv = new BallSurfaceView(this); //下两句为设置全屏 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); butStop =(Button)findViewById(R.id.butStop); butStop.setOnClickListener(new listener()); butStart =(Button)findViewById(R.id.butStart); butStart.setOnClickListener(new listener()); butRestart =(Button)findViewById(R.id.butRestart); butRestart.setOnClickListener(new listener()); bsv = (BallSurfaceView) findViewById(R.id.ballSurfaceView); } class listener implements View.OnClickListener{ @Override public void onClick(View v) { Button but = (Button)v; switch(but.getId()){ case R.id.butStop: bsv.setStop(); break; case R.id.butStart: bsv.setStart(); break; case R.id.butRestart: bsv.setRestart(); break; } } } } <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > <Button android:id="@+id/butStop" android:text="stop" android:layout_height="wrap_content" android:layout_width="wrap_content" > </Button> <Button android:id="@+id/butStart" android:text="Start" android:layout_height="wrap_content" android:layout_width="wrap_content" > </Button> <Button android:id="@+id/butRestart" android:text="ReStart" android:layout_height="wrap_content" android:layout_width="wrap_content" > </Button> </LinearLayout> <FrameLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <cn.edu.heut.zcl.BallSurfaceView android:id="@+id/ballSurfaceView" android:layout_width="fill_parent" android:layout_height="fill_parent"> </cn.edu.heut.zcl.BallSurfaceView> </FrameLayout> </LinearLayout>
有问题的留言,篮球运动是直接修改的上一节的例子,需要代码的留下邮箱。
评论
16 楼
小鱼小鹰
2014-09-10
现在还能吗。。。296252344@qq.com
15 楼
再_见孙悟空
2014-01-21
这个应该跑不动的,SurfaceView对象根本就获取不到
14 楼
valvekim
2013-06-14
楼主, 8881816@163.com. 感谢.
13 楼
我de专属doll
2012-11-01
private void move() {
162. if(maxHeight >= (bsv.screenHeight - HEIGHT)) {
163. return;
164. }
165. if(upDirection){//向上
166. runY = runY + STEPLENGTH ;
167. }else{
168. runY = runY - STEPLENGTH ;
169. }
170. }
171.
这段逻辑 没问题吗?如果方向为真的话 是向上运动 ,为什么球的位置还要加呢 ,不是该减了?求解答
162. if(maxHeight >= (bsv.screenHeight - HEIGHT)) {
163. return;
164. }
165. if(upDirection){//向上
166. runY = runY + STEPLENGTH ;
167. }else{
168. runY = runY - STEPLENGTH ;
169. }
170. }
171.
这段逻辑 没问题吗?如果方向为真的话 是向上运动 ,为什么球的位置还要加呢 ,不是该减了?求解答
12 楼
我de专属doll
2012-11-01
18638140959@126.com 希望楼主给我发一份源码 谢谢 打成jar包也行 只要能跑起来[color=red][/co[size=small][/size]lor]
11 楼
罗幕轻寒
2012-10-08
gooole.hi@gmail.com 谢谢大神
10 楼
sxd616616
2012-08-22
sxd616616@163.com 楼主无私!感谢
9 楼
Awen134
2012-02-27
awenyini@foxmail.com
8 楼
czxj2003
2011-12-08
哈。多谢了。根据上面代码调试出来了。。
7 楼
czxj2003
2011-12-08
czxj2003@yahoo.com.cn
试了你贴出来的代码,没有成功。请给我一份。。。
试了你贴出来的代码,没有成功。请给我一份。。。
6 楼
natepan
2011-11-26
希望给一个源码,327263944@qq.com,谢谢!
5 楼
jing_wang_2011
2011-11-03
634069490@qq.com
哥们麻烦给我一份啊
哥们麻烦给我一份啊
4 楼
jing_wang_2011
2011-11-03
634069490@qq.com
哥们麻烦给我一份啊
哥们麻烦给我一份啊
3 楼
jing_wang_2011
2011-11-03
634069490@qq.com
哥们麻烦给我一份啊
哥们麻烦给我一份啊
2 楼
sunjunliangsunjun
2011-10-17
565426086@qq.com
1 楼
sunjunliangsunjun
2011-10-17
哥们呢 麻烦 给我发一份能跑起来的代码 Thank u !
发表评论
-
eclipse 快捷键 for macbook (自用备份)
2011-11-06 19:31 1697产看方法被谁调用: cmd + shift + g -
android去除状态栏和下面视图之前的黑线
2011-08-30 11:13 3499<style name=" ... -
sqlite3 常用命令 for android
2011-08-16 10:59 13351)创建数据库文件: ... -
解决Window系统adb shell后中文显示乱码
2011-08-16 10:52 6070Android中使用的是UTF-8字符,而CMD默认字符集 ... -
(转)Eclipse xml formatter setting for android
2011-08-16 10:03 1691Android里使用很多xml 定义layout,我们 ... -
Android TabActivity实现多页显示效果
2011-03-05 01:28 29451TabActivity实现多页显示 ... -
ListView进阶系列之一 内容顺序淡淡显示
2011-03-04 10:06 5900ListView进阶系列之一 内容顺序淡淡显示 listVi ... -
Android Animation 高手必读 之一 Tweened Animations 代码实现
2011-02-27 23:55 9298半小时搞定Android Animation 之一 作者:L ... -
android布局文件中的include
2011-02-27 00:46 8962居然没有发现,在xml文件中可以使用include,我晕 一 ... -
【收集】Android 面试题
2011-02-25 23:42 9812这个是我自己整理的一些面试题,都是在网上找的,非原创。面试前可 ... -
handler异步控制Runnable
2011-02-20 11:03 91651 关于改变Activity中TextView的方法 ... -
Android消息机制入门一
2011-02-19 19:54 2064Android消息机制入门 ... -
SurfaceView简单例子
2011-02-13 23:53 8312SurfaceView简单例子 作者:Legend ... -
SurfaceView概述
2011-02-13 21:20 16355SurfaceView概述 作者 ... -
Surface概述
2011-02-13 16:18 3234Surface概述 作者:L ... -
Activity之间的相互调用与传递参数
2011-01-05 19:08 11958Activity之间的相互调用与传递参数 作 ... -
SharedPreferenced
2010-12-25 21:49 1949SharedPreferenced ... -
Android中进行单元测试
2010-12-23 13:35 1613Android中进行单元测试 作者:LEGEND ... -
Android 与 MVC
2010-12-23 12:30 3723Android & MVC 作者:LEGEND ... -
android中文件IO
2010-12-23 01:31 3221Android中文件的读写 ...
相关推荐
这是一款android进度条自定义的控件,用到了混合模式,进度条覆盖到文字的时候,覆盖到哪里,哪里变成白色,
...本以为这个东西很简单,实际上手的时候发现,还有很多逻辑需要处理,稍不注意就容易乱套。写个UI效果图大约只花了... 1、整个自定义控件是继承View还是SurfaceView呢?我的经验告诉我:需要一直不断绘制的最好继承Sur
第3章 Android控件架构与自定义控件详解 32 3.1 Android控件架构 33 3.2 View的测量 34 3.3 View的绘制 37 3.4 View Group的测量 38 3.5 View Group的绘制 39 3.6 自定义View 39 3.6.1 对现有控件进行拓展 40...
效果图如下: 一、为预览控件设置圆角 为控件设置ViewOutlineProvider public RoundTextureView(Context ... public void getOutline(View view, Outline outline) { Rect rect = new Rect(0, 0, view.getMeas
首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: activity_main.xml android:layout_width=match_parent android:layout_height=match_parent> <SurfaceView android:id=@+id...
使用多种方式(View/SurfaceView/TextureView)实现高效绘制 B站xml弹幕格式解析 基础弹幕精确还原绘制 支持mode7特殊弹幕 多核机型优化,高效的预缓存机制 支持多种显示效果选项实时切换 实时弹幕显示支持 换行弹幕...
4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...
4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...
4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...
自定义控件,如对话框背景等,或去google code找些开源的代码下来研究,学习人家的设计思想、模块功能的划分、代码组织结构等知识 这个过程中,涉及到的知识比较多,如版本管理工具SVN、Git、Mercurial,如设计模式...
4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...
5.7 图文可视化提醒——Toast与LinearLayoutView 5.8 状态栏的图标与文字提醒——NotificationManager与Notification对象的应用 5.9 搜索手机通讯录自动完成——使用ContentResolver 5.10 取得联系人资料——...
4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片...
4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...
4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...
4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...
4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...