- 浏览: 5816030 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
接上一篇在SurfaceView上拖动一张小图片
什么叫拖动飞机呢?且看
怎么样?厉害吧,飞机都能拖动。:P
布局随便弄一个:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppView view=new AppView(this);
// setContentView(view);
setContentView(R.layout.main);
}
图片文件:
一个游戏角色在屏幕行走的demo
http://blog.csdn.net/xiaominghimi/article/details/6090631
什么叫拖动飞机呢?且看
怎么样?厉害吧,飞机都能拖动。:P
public class AppView extends SurfaceView implements SurfaceHolder.Callback,Runnable,OnTouchListener{ private static final String tag="AppView"; private Context context; private SurfaceHolder holder; private Bitmap player; private int playerWidth,playerHeight; private int indexX,indexY;//图片的索引帧 private int x,y; private Paint paint; private boolean running=true; private Rect view;//游戏视窗 public AppView(Context context) { super(context); // TODO Auto-generated constructor stub this.context=context; holder = this.getHolder();//获取holder holder.addCallback(this); this.setOnTouchListener(this); } public AppView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub this.context=context; holder = this.getHolder();//获取holder holder.addCallback(this); this.setOnTouchListener(this); } private void init(){ view=new Rect(this.getLeft(),this.getTop(),this.getRight(),this.getBottom()); player =getImage(context,R.drawable.player); playerWidth=player.getWidth()/3;//有3帧 playerHeight=player.getHeight(); indexX=1;//初始化帧索引 indexY=0; x=(view.width()-playerWidth)>>1;//初始化角色位置 y=(view.height()-playerHeight)>>1; rect=new Rect(x,y,x+playerWidth,y+playerHeight);//图片的可拖动rect paint=new Paint(); } private void close(){ } private void logic(){ } private void draw(){ Canvas canvas = holder.lockCanvas();//获取画布 canvas.drawColor(Color.BLACK); canvas.save(); canvas.clipRect(rect); canvas.drawBitmap(player, rect.left-playerWidth*indexX,rect.top-playerHeight*indexY,null); // canvas.clipRect(screen); canvas.restore(); holder.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像 } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub Log.i(tag, "=================surfaceCreated======================"); init(); running=true; new Thread(this).start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub Log.i(tag, "=================surfaceDestroyed======================"); running=false; close(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub Log.i(tag, "=================surfaceChanged======================"); } @Override public void run() { // TODO Auto-generated method stub int SLEEP_TIME=100; while (running) { long start=System.currentTimeMillis(); logic(); draw(); long end=System.currentTimeMillis(); if(end-start<SLEEP_TIME){ try { Thread.sleep(SLEEP_TIME-(end-start)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } // Region region=new Region(); private Point point=new Point();//点击点 private Rect rect;//图片的可拖动rect private boolean canDrag=false;//判断是否点击在图片上,否则拖动无效 private int offsetX=0,offsetY=0;//点击点离图片左上角的距离 private VelocityTracker tracker = null;//速度跟踪器,用于判断飞机偏左还是偏右移动 @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch (event.getAction()) { case MotionEvent.ACTION_DOWN: point.x=(int)event.getX(); point.y=(int)event.getY(); if(rect.contains(point.x, point.y)){ canDrag=true; offsetX=point.x-rect.left; offsetY=point.y-rect.top; if(tracker == null){ tracker = VelocityTracker.obtain(); }else{ tracker.clear(); } tracker.addMovement(event); } break; case MotionEvent.ACTION_MOVE: if(canDrag){ rect.left=(int)event.getX()-offsetX; rect.top=(int)event.getY()-offsetY; rect.right=rect.left+playerWidth; rect.bottom=rect.top+playerHeight; tracker.addMovement(event); tracker.computeCurrentVelocity(1000); float XVelocity=tracker.getXVelocity(); // Log.i(tag, "XVelocity="+XVelocity); if(XVelocity<-100){//偏左 indexX=0; indexY=0; }else if(XVelocity>100){//偏右 indexX=2; indexY=0; }else{ indexX=1; indexY=0; } if (rect.left < 0) { rect.left = 0; rect.right = rect.left+playerWidth; indexX=1; indexY=0; } if (rect.right > getMeasuredWidth()) { rect.right = getMeasuredWidth(); rect.left = rect.right-playerWidth; indexX=1; indexY=0; } if (rect.top < 0) { rect.top = 0; rect.bottom = rect.top+playerHeight; } if (rect.bottom > getMeasuredHeight()) { rect.bottom = getMeasuredHeight(); rect.top = rect.bottom-playerHeight; } } break; case MotionEvent.ACTION_UP: // case MotionEvent.ACTION_CANCEL: if(canDrag){ tracker.recycle(); canDrag=false; indexX=1; indexY=0; } break; default: break; } return true; } //**************************************************************************** public static final Bitmap getImage(Context context, int imageId) { return BitmapFactory.decodeResource(context.getResources(),imageId); } }
布局随便弄一个:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppView view=new AppView(this);
// setContentView(view);
setContentView(R.layout.main);
}
图片文件:
一个游戏角色在屏幕行走的demo
http://blog.csdn.net/xiaominghimi/article/details/6090631
发表评论
-
利用广播实现强制下线功能
2016-12-28 10:45 1462最近一口气买 ... -
Android百分比布局Percent支持库
2015-09-02 11:08 3142虽然有很多的布局可以在 Android 应用程序开发的世界供我 ... -
ViewDragHelper行为测试
2015-08-12 17:36 2737只是简单记录一下 以后可能会实现一些效果 import ... -
android5.x之Palette调色板
2015-07-17 10:30 3336Palette类可以分析一张图片,取出这张图片的特征色,然后为 ... -
使用ClipboardManager剪贴板实现复制粘贴功能
2015-04-10 14:39 3767经常要使用复制粘贴的功能,比如长安一个TextView弹出一个 ... -
LocationListener监听位置变化,当进入到某一距离内时发出提醒
2014-08-19 15:03 7672项目中需要这样的要求: 启动一个服务一直在背后监听当前位置变化 ... -
Android下集成FacebookSDk到项目并发表评论
2013-08-28 14:36 4873项目中需要发表自己的评论到Facebook,需要集成Faceb ... -
MediaRecorder录音,MediaPlayer播放
2013-05-23 09:53 7532直接看代码 import java.io.DataOutp ... -
Notification的基本用法
2013-05-22 11:52 5952android4.0以前: private static ... -
android音频、视频、拍照基础操作
2013-03-27 11:55 2822播放音乐和视频用的是类:MediaPlayer 刻录声音和视 ... -
tabhost通过手势滑动切换activity
2013-02-18 17:59 11152package com.mars.mp3player; ... -
VideoView简单视频播放
2013-02-17 17:17 9292只是上上手而已的例子。 package com.chen ... -
android 再按一次后退键退出应用程序
2012-06-15 21:51 4121private static Boolean isExit ... -
AlarmManager全局定时器/闹钟
2012-02-01 10:11 5856http://407827531.iteye.com/blog ... -
倒计时的CountDownTimer
2011-12-23 13:06 31234直接看这里吧,我只是搬运工。 定时执行在一段时候后停止的倒计 ... -
Android流量统计TrafficStats类的使用
2011-12-06 16:25 26456对于Android流量统计来说在2.2版中新加入了Traffi ... -
ScrollView当显示超出当前页面时自动移动到最底端
2011-09-01 09:42 17002卷轴视图(ScrollView)是指当拥有很多内容,一屏显示不 ... -
在SurfaceView上拖动一张小图片
2011-08-22 18:20 5240用手指随便拖。这里采用了线程去绘制,其实也可以在onTouch ... -
用getIdentifier()获取资源Id
2011-07-28 22:36 10768做项目过程中遇到一个问题,从数据库里读取图片名称,然后调用图片 ... -
利用VelocityTracker监控对触摸的速度跟踪
2011-07-28 22:12 10057VelocityTracker就是速度跟踪的意思。我们可以获得 ...
相关推荐
在描述中提到的"在SurfaceView上放置控件如按钮等,采用FrameLayout",这是实现这一目标的一种方法。FrameLayout是一个布局容器,它允许你在屏幕上的任意位置堆叠多个视图,可以理解为一个透明的框架,你可以将任何...
在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理视频播放或游戏等需要连续刷新的场景。本话题主要探讨如何利用SurfaceView实现图片的缩放和滑动功能。 首先,理解...
在Android游戏开发中,将一个`Button`控件悬浮于`SurfaceView`之上是一项常见的需求。这通常是为了解决在游戏界面中添加交互元素,如暂停、设置或返回按钮,以便用户可以随时进行操作。本篇文章将深入探讨如何实现这...
在Android平台上进行游戏开发时,SurfaceView是一个至关重要的组件,它是专门为高性能图形设计的,比如游戏、视频播放等需要连续刷新显示的应用。SurfaceView提供了一种优化的绘图机制,可以将绘制操作与应用程序的...
4. 使用Layout嵌套:可以将SurfaceView和控件放入一个单独的FrameLayout或RelativeLayout中,这样可以确保它们在同一个层级上,但仍然需要注意由于SurfaceView的特殊性,控件可能需要手动调整位置。 总的来说,...
在这个"SurfaceView控制位图缩放、拖移"的Demo中,我们将探讨如何利用SurfaceView来实现位图的动态缩放和拖动功能。 首先,我们需要理解SurfaceView的基本工作原理。SurfaceView拥有自己的渲染线程,它独立于UI线程...
SurfaceView是Android系统中一种特殊的View,它在处理多媒体或者高性能图形渲染时有着独特的优势。在移动设备上,用户交互通常涉及到触摸事件,包括单点触摸和多点触控。多点触控允许用户通过两个或更多的手指进行...
- 在SurfaceView上增加Bitmap,可以先创建Bitmap,然后在Canvas上绘制该Bitmap,如`canvas.drawBitmap(bitmap, srcRect, dstRect, paint)`。 4. **屏幕截图**: - 要截图SurfaceView,首先需要将SurfaceView的...
- 使用`FrameLayout`或`RelativeLayout`:将SurfaceView和其他View放入一个父容器(如FrameLayout或RelativeLayout),然后通过设置LayoutParams来调整各个View的相对位置,使得其他View能显示在SurfaceView之上。...
在Android开发中,SurfaceView是一种特殊的视图,用于高效地显示动态图像,比如播放视频或者进行游戏渲染。标题“SurfaceView放大和缩小”涉及到的是如何在Android应用中实现对SurfaceView内的视频画面进行局部放大...
SurfaceView在Android开发中是一个非常重要的视图组件,它被设计用于处理高性能、低延迟的图形渲染,尤其适合游戏和视频等对实时性要求较高的应用。这个示例项目旨在展示如何在Android平台上实现高速显示功能。 ...
`SurfaceView`创建了一个独立的窗口,并在自己的Surface上绘制内容。这使得它可以在后台线程进行高效的绘制,但同时也意味着普通的截图方法如`View.draw()`或`View.getDrawingCache()`无法获取到`SurfaceView`的内容...
在SurfaceView中集成Camera,我们需要创建一个SurfaceHolder作为SurfaceView的回调,然后在Camera的previewCallback中将相机预览的每一帧数据写入Surface。Camera.open()用于打开摄像头,setPreviewDisplay()设置...
在Android应用开发中,SurfaceView是一种特殊的视图组件,它为高性能的图形渲染提供了底层支持,常用于游戏或者视频播放等需要连续更新画面的场景。本文将深入探讨如何在SurfaceView中添加Animation,以实现丰富的...
SurfaceView的工作原理是通过创建一个独立的 Surface,这个 Surface 不同于普通的 View,它有自己的渲染线程,可以直接在硬件层面上进行渲染,避免了与UI主线程的交互,从而提高了视频播放的流畅性。在这个例子中,...