在这里制作一个9宫格的小程序,如果超过9个,那么就自动翻页。翻页采用划动实现,并且有惯性作用。
原理
mobile手机里滑动效果主要是原理是支持屏幕的触摸,当我们按下、松开时系统分别可以捕捉到相应的坐标位置,然后动态的改变布局,从而达到划动的效果。
图型button
由于mobile还没有支持图片button,所以我们做出一个辅佐类,当按下、弹开时分别使用钢笔绘制不同的图片到屏幕。
当mouse按下时,判断是否在图像所在的区域内,就执行按下时绘制图像。并且判断两次按下时间小于300毫秒,就认为是双击,发出注册双击事件。当mouse弹起时,恢复按前的图像,并且如果按下时间间隔不超过100毫秒,认为是单击。
初使化按扭
程序中的button,放置在XML中,以方便动态的加载。pat是正常的路径,presspath是按下时显示的图片。
在mobile中获取文件的路径与windows下不同, string path = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
这样才能找到当前动行的程序路径.
在对XML文件中的初使化,并赋值给图像按钮,并且注册事件
Point是分页时在下方的位置产生一个小圆点,代表页数和当前页。
绘制按扭
OnPaint 是窗体的方法,它是在调用Invalidate后自动执行。在这里控制每行显示3个,每页显示9个,如果有分页画划分页小圆点。在系统初使化,mouse 按下,弹出时都调用Invalidate方法,放系统重画UI。为了防卡需要override OnPaintBackground,这点我也不是很明白,如果有高手请多指教。
实现划动效果
void Form1_MouseDown(object sender, MouseEventArgs e)
{
x=e.X;
y = e.Y;
}
void Form1_MouseMove(object sender, MouseEventArgs e)
{
moveX = e.X - x;
moveY = e.Y - y;
if ((Math.Abs(moveX) + Math.Abs(moveY)) > 5)
{
this.Invalidate();
}
}
mouse按下时,记录坐标,弹起时,计算偏移量,并且重绘UI.这对手机的性能有一定的要求,可能会有点卡,但是我个人觉得还是可以接受.不知各位有没有更好的方法.
实现惯性
当划动到边的松开时候,如果有下一页,则翻到下一页,如果没有,则慢慢的返回到原来的位置。
实现这个功能主要是使用一个timer控件。用TIMER来计算位置,具体实现请看代码。
参考:http://iphoneui.codeplex.com/
下载:https://files.cnblogs.com/mediar/MobileTest.rar