安卓(android)实现 翻页功能原理分析

 更新时间:2016年9月20日 20:00  点击:2473
本文章介绍了三种关于安卓(android)实现 翻页功能原理分析,有需要的同学可以参考一下本文章说到的几种方案哦。

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;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;

/**
 * Android通过手势实现图像拖拽功能
 * @author Administrator
 *
 */
public class DragActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.main);
        View view = new ImageDragView(this);
       
        setContentView(view);
    }

    class ImageDragView extends View {

        private float x1;
        private float y1;
        private float x2;
        private float y2;

        public ImageDragView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            // TODO Auto-generated method stub

            float size = event.getSize();

            int szi = (int) size;
            int dxi = szi >> 12;
            int dyit = ((1 << 12) - 1);
            int dyi = szi & dyit;

            DisplayMetrics metrics = getResources().getDisplayMetrics();
           
            float dx = metrics.widthPixels * dxi / (float) dyit;
            float dy = metrics.heightPixels * dyi / (float) dyit;

            x1 = event.getX();
            y1 = event.getY();

            x2 = x1 + dx;
            y2 = y1 + dy;

            invalidate();

            return true;
        }

        @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);

            float r = (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2)
                    * (y1 - y2)) / 2;
            r = 100 >= r ? 100 : r;

            Paint paint = new Paint();
            paint.setColor(Color.RED);
            canvas.drawCircle(x1, y1, r, 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>
    <uses-permission android:name="android.permission.INTERNET"/>

检查网络状态代码如下

 代码如下 复制代码

public boolean CheckNetworkState()
    {
        boolean flag = false;
        ConnectivityManager manager = (ConnectivityManager)getSystemService(
                Context.CONNECTIVITY_SERVICE);
        if(manager.getActiveNetworkInfo() != null)
        {
            flag = manager.getActiveNetworkInfo().isAvailable();
        }
        if(!flag)
        {
            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) {
                    // TODO Auto-generated method stub
                    Intent mIntent = new Intent("/");
                    ComponentName comp = new ComponentName("com.android.settings",
                            "com.android.settings.WirelessSettings");
                    mIntent.setComponent(comp);
                    mIntent.setAction("android.intent.action.VIEW");
                    startActivity(mIntent);
                }
            });
            builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            builder.create();
            builder.show();
        }
       
        return flag;
       
    }

 

效果如下,用户可以点击确定来设置网络,比如启动wifi

-------------------------------------------------------------------------------------------------
如果希望网络连接时做一些事情的话,需要判断当前网络状态是否为true,为真则进行一些操作,否则设置网络。还可以用另外一种方式,其实差不多

 代码如下 复制代码

//setnetwork
    public void setNetwork()
    {
        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) {
                // TODO Auto-generated method stub
                Intent mIntent = new Intent("/");
                ComponentName comp = new ComponentName("com.android.settings",
                        "com.android.settings.WirelessSettings");
                mIntent.setComponent(comp);
                mIntent.setAction("android.intent.action.VIEW");
                startActivity(mIntent);
            }
        });
        builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
           
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        builder.create();
        builder.show();
    }
   
    //NETWORK
    public boolean isNetworkAvailable()
    {
        Context context = getApplicationContext();
        ConnectivityManager connect = (ConnectivityManager)context.getSystemService(
                Context.CONNECTIVITY_SERVICE);
        if(connect==null)
        {
            return false;
        }else//get all network info
        {
            NetworkInfo[] info = connect.getAllNetworkInfo();
            if(info!=null)
            {
                for(int i=0;i<info.length;i++)
                {
                    if(info[i].getState()==NetworkInfo.State.CONNECTED)
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }


 

然后通过判断如果当前状态可用则执行相关代码,不可用则设置网络

 代码如下 复制代码

if(isNetworkAvailable())
{
相关代码
}else
{
setNetwork();
}]

这篇文章中已经介绍了网络状态的判断,但是测试后发现用此方法只能够判断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手机开的朋友介绍一下android手机开发平台环境配置教程,有需要的同学可以参考一下本教程。

初学Android,以便记录学习过程,增强学习效果。

1.       下载搭建android开发平台的必要工具
1)      Jdk1.6 -http://www.oracle.com/technetwork/java/javase/downloads/index.html
2)      Eclipse(Eclipse IDE for Java Developers),可以是其他版本 -http://www.eclipse.org/downloads/
3)      SDK -http://developer.android.com/sdk/index.html
4)      ADT -http://developer.android.com/sdk/eclipse-adt.html
2.       安装JDK,一直next即可,环境变量可以不配置,对开发不影响。可在CMD中验证是否安装成功,如下图
3.       安装Eclipse,解压缩就可以
4.       安装ADT,作为Eclipse的插件,安装过程是一致的,可以选择在线安装.贴图离线安装过程:
1)eclipse->help->install new software
2)点击ADD
3)Name-可以随便取,Location-选择ADT压缩包
 
4)可以看到Developer Tools下有四个工具包:
1.DDMS:DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务。它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。
2.Development Tools:相关开发工具
3.Hierarchy Viewer:Hierarchy Viewer是随AndroidSDK发布的工具,位置在tools文件夹下,名为hierarchyviewer.bat。主要功能有2个:
⑴从可视化的角度直观地获得UI布局设计结构和各种属性的信息,帮助我们优化布局设计;
⑵结合debug帮助观察特定的UI对象进行invalidate和requestLayout操作的过程。
4.Traceview:Traceview是android平台配备一个很好的性能分析的工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method。
剩下就是Next即可
5.       安装SDK,解压缩SDK压缩包,解压目录中最好不要有中文或者其他特殊字符(空格等)
1)在eclipse直接启动SDK Manager
2)打开SDK Manager主界面,选择要安装的版本
 
3)点击安装即可完成
4)安装完成,然后配置eclipse.,点击eclipse->window->Preference
 
5)选中左侧Android,SDK Location选择SDK解压目录,点击APPLY, 然后OK
 
6.       配置虚拟机,认识虚拟机
1)打开虚拟机
2)选择New
 
3)弹出虚拟机配置界面,Name:虚拟机名称(可任意)
Target:选择虚拟Android版本
CPU/ABI:默认
SD Card:SD卡大小
Snapshot:是否需要截屏
Skin:选择皮肤(基本上是分辨率的不同)
Hareware:软件一般默认
4)可以看到刚才建的虚拟机列表,点击start,开启虚拟机
 
5)经过小小的等待之后就可以看到可爱的小机器人了
 
7.       认识SDK,网络版http://developer.android.com/sdk/index.html与离线版
1) 有网络的请打开http://developer.android.com/sdk/index.html,可以下载,查看SDK的各个版本及详细介绍。
 
2)SDK安装成功后,可在安装目录下查看离线版
 
[!--infotagslink--]

相关文章

  • 苹果告别“高大上”,越来越向安卓和中国用户靠近

    “一起,让我们将这个世界变得更好。”苹果首席执行官蒂姆 库克对着台下5000多名开发者说道,声音略有些沙哑和颤抖。...2016-07-04
  • php语言实现redis的客户端

    php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
  • jQuery+jRange实现滑动选取数值范围特效

    有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • JS实现的简洁纵向滑动菜单(滑动门)效果

    本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • jQuery+slidereveal实现的面板滑动侧边展出效果

    我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • PHP+jQuery翻板抽奖功能实现

    翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • SQLMAP结合Meterpreter实现注入渗透返回shell

    sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25
  • 安卓开发之设置密码只能输入字母和数字的组合

    设置登录密码我们一般会有限制的如由什么组合了,下面我们来看一篇关于安卓开发之设置密码只能输入字母和数字的组合方法,具体的细节如下所示。 无论是电脑还是手机...2016-09-20
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • PHP实现今天是星期几的几种写法

    复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; }else if( $da == "2" ){ echo "今天是星期二"; }else if( $da == "3" ){ echo "今天是星期三"; }else if( $da == "4"...2013-10-04