VB开发安卓程序_例程9旋转移动图片

运行截图

当手指在手机屏幕上触碰后,屏幕上的图片就会马上追随过来。可以用这里学到的知识去创建游戏人物。

Main窗体代码如下:


#Region 代码说明

'说明:当手指在手机屏幕上触碰后,屏幕上的图片就会马上追随过来。可以用这里学到的知识去创建游戏。

#End Region

#Region Module Attributes
	#FullScreen: true
	#IncludeTitle: True
	#ApplicationLabel: 移动图片
	#VersionCode: 1
	#VersionName: 
	#SupportedOrientations: unspecified
	#CanInstallToExternalStorage: False
#End Region

'Activity module
Sub Process_Globals

	Dim x0 As Float 
	Dim y0 As Float	
	'x0和y0被赋值后,这个坐标将位于屏幕的中心点
	
	Dim x1, y1 As Float
	
	Dim Angle As Float				:	Angle = 0
	' Angle 角度,这个变量用来控制图片旋转角度
	
	Dim Speed As Float				: Speed = 5dip
	'Speed 速度
		
	Dim Timer1 As Timer
	'定义一个定时器
	
End Sub

Sub Globals

	Dim bmpImage, bmpImageT As Bitmap
	'定义两个位图对象
	
	Dim cvsMain As Canvas
	'定义一个画布对象	
	
	Dim rectSrc, rectDest As Rect
	'定义两个矩形对象,rect 矩形, rectSrc 原始矩形, rectDest目的矩形
		
	'这个例程涉及到较多绘制图片的知识点,大家在学习中要多多留意和学习
	
End Sub


Sub Activity_Create(FirstTime As Boolean)
	
	'x0和y0被赋值后,这个坐标将位于屏幕的中心点
    x0 = 50%x
	y0 = 50%y
		
	
	'调用资源文件里面的一张图片
	bmpImage.Initialize(File.DirAssets,"man1.png")
	'载入目录资料中的一个图片文件给bmpImage

	rectSrc.Initialize(0, 0, bmpImage.Width, bmpImage.Height)
	'定义一个矩形区域,这个矩形将位于屏幕左上角
	'这个矩形区域现在只是定义,只存在于手机内存中,屏幕上是看不到的,
	'bmpImage.Width和bmpImage.Height其实就是man1.png的高宽,可以用这种方法来获取图片的高宽
		
	rectDest.Initialize(x0 - bmpImage.Width / 2, y0 - bmpImage.Height / 2, x0 + bmpImage.Width / 2, y0 + bmpImage.Height / 2)
	'定义一个矩形区域,这个矩形将位于屏幕水平和垂直点的中心偏左上角一点
		
	Timer1.Initialize("Timer1",50)
	'启动定时器随时监控屏幕的动静,50/1000毫秒
	
	
	
	cvsMain.Initialize(  Activity)
	'通过初始化将确定cvsMain对象对哪个控件进行绘画
	
	cvsMain.DrawBitmapRotated( bmpImage, rectSrc, rectDest, Angle)
	'在Activity窗体的背景上画一个有旋转角度的矩形区域,并在这个矩形填充一个图片
	'Rotated adj. 旋转的
	
	'库 Core > 类 Canvas > 方法 DrawBitmapRotated (绘制位图并旋转它)
	'DrawBitmapRotated ( Bitmap1 As Bitmap, SrcRect As Rect, DestRect As Rect, Degrees As Float ) 
	'Bitmap1 - 被绘制的位置
	'SrcRect(源矩形) - 将被绘制的位图的子集.如果为 Null(空)则完整绘制位图. 
	'DestRect(目标矩形) - 将被绘制的位图矩形. 
	'Degrees - 位图旋转的角度度数(顺时针) 
	
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub Activity_Touch (Action As Int, X As Float, Y As Float)
	'在窗体上触碰就引发此事件,当手指触碰时就会移动屏幕上的图片
	
	Select Action
	
	Case Activity.ACTION_DOWN
	
				Log(DateTime.Time(DateTime.Now) & "  Activity.ACTION_DOWN")
				
				cvsMain.DrawRectRotated( rectDest, Colors.Black, True, 1, Angle)
				'不加上面这句代码,移动图片时会有一些痕迹在屏幕上的
				'这句代码就是用来遮蔽这些移动的痕迹
				'由于Activity的背景色是黑色,所以用黑色来填充矩形
				
				'库 Core > 类 Canvas > 方法 DrawRectRotated (绘制一个旋转的矩形)
				'DrawRectRotated ( Rect1 As Rect, Color As Int, Filled As Boolean, StrokeWidth As Float, Degrees As Float ) 
				
				'Rect1-矩形对象
				'Color-背景色
				'Filled - 是否填充矩形 
				'StrokeWidth - 边缘宽度.当 Filled=False 用才有用. 
				'Degrees - 矩形顺时针旋转的角度
						
						
				Angle = CalcAngle(X,Y)
				'计算出旋转的角度值是多少,Calc 计算
				
				Timer1.Enabled = True
				'激活定时器,使之工作
				
				cvsMain.DrawBitmapRotated(bmpImage, rectSrc, rectDest, Angle)
				
				
				x1 = X
				y1 = Y
						
				Activity.Invalidate
				'使Activity窗体失去焦点
		
	Case Activity.ACTION_MOVE
	
				Log(DateTime.Time(DateTime.Now) & "  Activity.ACTION_MOVE")
			
				cvsMain.DrawRectRotated(rectDest, Colors.Black, True, 1, Angle)
				Angle = CalcAngle(X,Y)
				x1 = X
				y1 = Y
				Timer1_Tick
		
	Case Activity.ACTION_UP
		'当手指不触碰屏幕时就停止移动图片
		
				Log(DateTime.Time(DateTime.Now) & "  Activity.ACTION_UP")
			
				Timer1.Enabled = False
				Activity.Title = ""
		
	End Select
	
End Sub

Sub CalcAngle(x As Float, y As Float) As Float
	Dim a As Float
	
	If x - x0 = 0 Then
		a = 90
	Else
		a = ATanD((y - y0)/(x - x0))
	End If
	If x - x0 < 0 Then
		a = a + 180
	End If
	Return a
End Sub


Sub Timer1_Tick '时钟控件事件

	cvsMain.DrawRectRotated(rectDest, Colors.Black, True, 1, Angle)
	'库 Core > 类 Canvas > 方法 DrawRectRotated (绘制一个有旋转角度的矩形)
	'DrawRectRotated ( Rect1 As Rect, Color As Int, Filled As Boolean, StrokeWidth As Float, Degrees As Float ) 
	'Rect1-矩形对象 
	'Filled填充 - 是否填充矩形 
	'StrokeWidth边缘宽度 - 边缘宽度.当 Filled=False 用才有用. 
	'Degrees角度 - 矩形旋转的角度(顺时针)
	
	x0 = x0 + Speed * CosD(Angle)
	y0 = y0 + Speed * SinD(Angle)
	
	rectDest.Initialize(x0 - bmpImage.Width / 2, y0 - bmpImage.Height / 2, x0 + bmpImage.Width / 2, y0 + bmpImage.Height / 2)
	
	If Abs(x0 - x1) < 3dip And Abs(y0 - y1) < 3dip Then
	
		Timer1.Enabled = False
		Activity.Title = "到达手指触碰点"
		x0 = x1
		y0 = y1
	
	Else
	
		Activity.Title = ""	
		
	End If
	
	cvsMain.DrawBitmapRotated(bmpImage, rectSrc, rectDest, Angle)
	
	Activity.Invalidate
	
	
End Sub



Sub Activity_KeyPress (KeyCode As Int) As Boolean

	If (KeyCode = KeyCodes.KEYCODE_BACK) Then
	
			If (Msgbox2("是否要退出程序?", "", "确定", "取消", "", Null) = DialogResponse.POSITIVE) Then
			
				'DialogResponse是一个预定义的对象,其中包含了可能的返回值
				'DialogResponse.Positive = -1	'点击确认按钮
				'DialogResponse.CANCEL= -3	'点击取消按钮 
			
				'Return False'返回False则表示按键信息交给系统处理
				ExitApplication '退出应用
				
'				Activity.Finish'关闭这个活动
			Else
				Return True'返回True则表示按键已经处理
			End If
					
	End If	
	
End Sub

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值