Android平台中的三种翻页效果实现。
第一种翻页效果如下:
实现原理:
当前手指触摸点为a,则 a点坐标为(ax,ay), 由三角形acb与三角形cmb为对称三角形并且直线cp为am垂直平分线,则 B点坐标为(ax/2,ay/2)。
作gf垂直于om且cb垂直于am, 三角形cfg与gfm相似,则 cf:gf = gf:mf cf=(gf * gf) / mf gf长度为g点纵坐标 mf长度为g点横坐标
cf长度可求 c点坐标可求 由c点、g点可确定过两点间的直线, 当该直线中x=0时求出与y足交点。
第二种翻页效果
实现原理:
使用贝赛尔曲线。曲线有四个点:起始点、终止点(也称锚点)以及两个相互分离的中间点。滑动两个中间点,贝塞尔曲线的形状会发生变化。
根据第一种翻页效果原理可以确定a、e、h、f、g ,由eh平行于cj且af垂直于eh,则 af垂直于cj则三角形egf相似于三角形cnf 则有ef:cf = gf:nf 。
设n为ag中点 则有cf=(3/2)*ef ,则c点坐标可求 由c点、k点坐标已知可知过两点间的直线
由该直线可计算与y轴相交点j 由a、e、c、j可计算两条直线的相交点b 同理可求点k。
在Android中的具体实现步骤:
起始页展示
1.创建屏幕尺寸的bmp 2.将图片转化为canvas 3.获取起始页面数据 3.在canvas中绘制起始页数据 4.在当前视图中复写onDraw进行重绘出bmp对象
翻页处理
1.初始化时创建两个bmp(bmp1、bmp2)并将其转换为canvas(canvas1、canvas2)
2.获取手势首次触摸的区域 (例:当首次点击屏幕的位置x<50&&y<50则为左上角)
3.根据首次点击区域判断需要展示的数据(例:首次点击处于左侧区域【左上、左下】的则判断操作为下一页操作)
4.获取下一页中数据并绘制出来在canvas2中
5.根据1中获取的区域位置调用起始动画使视图移动到手势首次点击位置
6.获取手势每次移动的坐标并根据移动坐标计算绘制的各个点的坐标
7.每次移动刷新视图
本示例实现Android通过手势可以实现图像的拖拽功能。运行效果如下:
代码如下 | 复制代码 |
package com.android.drag;import android.app.Activity; /** class ImageDragView extends View { private float x1; public ImageDragView(Context context) { @Override float size = event.getSize(); int szi = (int) size; DisplayMetrics metrics = getResources().getDisplayMetrics(); x1 = event.getX(); x2 = x1 + dx; invalidate(); return true; @Override float r = (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) Paint paint = new Paint(); |
本文章来讲述一下关于android(安卓)手机开发中的文件上传功能的实现方法,我们是利用了java来做开发的,有需要的同学可以参考一下下哈。
文件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的。下面是一个模拟网站程序上传文件的例子。这里只写出了Android部分的代码,服务器的代码没有贴出来,有需要完整上传功能代码的朋友可以跟我联系哟…
首先新建一个Android工程,新建主启动Activity:
代码如下 | 复制代码 |
MainActivity.java:
package com.xzq.upload;
import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast;
public class MainActivity extends Activity {
private String newName = "htys.mp3"; //要上传的本地文件路径 private String uploadFile = "/data/data/com.xzq/htys.mp3"; //上传到服务器的指定位置 private String actionUrl = "jsp">http://192.168.100.100:8080/upload/upload.jsp"; private TextView mTextView1; private TextView mTextView2; private Button mButton1;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTextView1 = (TextView) findViewById(R.id.myText2); mTextView1.setText("FilePath:/n" + uploadFile); mTextView2 = (TextView) findViewById(R.id.myText3); mTextView2.setText("UploadPath:/n" + actionUrl); /* 设定mButton的onClick事件处理 */ mButton1 = (Button) findViewById(R.id.myButton); mButton1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { uploadFile(); } }); }
private void uploadFile() { String end = "/r/n"; String Hyphens = "--"; String boundary = "*****"; try { URL url = new URL(actionUrl); HttpURLConnection con = (HttpURLConnection) url.openConnection(); /* 允许Input、Output,不使用Cache */ con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); /* 设定传送的method=POST */ con.setRequestMethod("POST"); /* setRequestProperty */ con.setRequestProperty("Connection", "Keep-Alive"); con.setRequestProperty("Charset", "UTF-8"); con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); /* 设定DataOutputStream */ DataOutputStream ds = new DataOutputStream(con.getOutputStream()); ds.writeBytes(Hyphens + boundary + end); ds.writeBytes("Content-Disposition: form-data; " + "name=/"file1/";filename=/"" + newName + "/"" + end); ds.writeBytes(end); /* 取得文件的FileInputStream */ FileInputStream fStream = new FileInputStream(uploadFile); /* 设定每次写入1024bytes */ int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; int length = -1; /* 从文件读取数据到缓冲区 */ while ((length = fStream.read(buffer)) != -1) { /* 将数据写入DataOutputStream中 */ ds.write(buffer, 0, length); } ds.writeBytes(end); ds.writeBytes(Hyphens + boundary + Hyphens + end); fStream.close(); ds.flush(); /* 取得Response内容 */ InputStream is = con.getInputStream(); int ch; StringBuffer b = new StringBuffer(); while ((ch = is.read()) != -1) { b.append((char) ch); } System.out.println("上传成功"); Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_LONG) .show(); ds.close(); } catch (Exception e) { System.out.println("上传失败" + e.getMessage()); Toast.makeText(MainActivity.this, "上传失败" + e.getMessage(), Toast.LENGTH_LONG).show(); } } }
|
最后别忘了在AndroidManifest.xml中设置访问Internet的权限:
代码如下 | 复制代码 |
<uses-permission android:name="android.permission.INTERNET" /> |
在Android中上传文件的原理跟在web中上传文件基本是一致的,代码比较简单,就不多做解释了
本文章先是介绍了判断wifi的网络状态,这个明显就会有问题,现在的网络有3G、2G那我们肯定不能少这两个啊,后面的程序加以更证了,有需要的同学可以看看。首先需要加入权限
代码如下 | 复制代码 |
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> |
检查网络状态代码如下
代码如下 | 复制代码 |
public boolean CheckNetworkState()
|
效果如下,用户可以点击确定来设置网络,比如启动wifi
-------------------------------------------------------------------------------------------------
如果希望网络连接时做一些事情的话,需要判断当前网络状态是否为true,为真则进行一些操作,否则设置网络。还可以用另外一种方式,其实差不多
代码如下 | 复制代码 |
//setnetwork
|
然后通过判断如果当前状态可用则执行相关代码,不可用则设置网络
代码如下 | 复制代码 |
if(isNetworkAvailable()) |
这篇文章中已经介绍了网络状态的判断,但是测试后发现用此方法只能够判断WIFI是否连接,而现在的智能机可以是wifi、3G、甚至2G。那么如果用上面的方法就不行了需要进行一下修改,使其在网络不连接(无论wifi、3G、2G)的时候也可以判断。代码如下
代码如下 | 复制代码 |
//Check network public void CheckNetworkState() { boolean flag = false; ConnectivityManager manager = (ConnectivityManager)getSystemService( Context.CONNECTIVITY_SERVICE); State mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); State wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); //如果3G、wifi、2G等网络状态是连接的,则退出,否则显示提示信息进入网络设置界面 if(mobile == State.CONNECTED||mobile==State.CONNECTING) return; if(wifi == State.CONNECTED||wifi==State.CONNECTING) return; showTips(); } private void showTips() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setTitle(R.string.netstate); builder.setMessage(R.string.setnetwork); builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 如果没有网络连接,则进入网络设置界面 startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); } }); builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.create(); builder.show(); } |
种方式更加简单,也更加有用,当然第一篇也有可取之处,可以加入3G状态检查即可
注意:别忘了加上权限
代码如下 | 复制代码 |
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> |
初学Android,以便记录学习过程,增强学习效果。