首页 > 编程技术 > android

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

发布时间:2016-9-20 20:00

本文章介绍了三种关于安卓(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--]

您可能感兴趣的文章: