当前位置: 首页 > news >正文

网站建设方案评标原则网络推广专员岗位职责

网站建设方案评标原则,网络推广专员岗位职责,做网站公司汉狮团队,代理平台哪个好一、提要 最近在iPhone有一款应用非常火,较做Clear,这个是演示视频:http://v.youku.com/v_show/id_XMzUyNjQ2NDk2.html 实施上它的功能非常的简单,类似一个ToDoList,但它将用户体验做到了极致,其中一个最大…

一、提要

最近在iPhone有一款应用非常火,较做Clear,这个是演示视频:http://v.youku.com/v_show/id_XMzUyNjQ2NDk2.html

实施上它的功能非常的简单,类似一个ToDoList,但它将用户体验做到了极致,其中一个最大的特点就是将手势和多点触控成功得融入到了应用之中。

这篇文章要探究的就是在Android中的手势和多点触控的原理及实现。


二、最原始的单点拖拽和两点缩放

原理:对于常规的控件触控操作,在setOnTouchListener()接口中,实现 onTouchEvent()方法来处理。

效果:


代码清单:

package com.example.multitouch;import android.os.Bundle;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.Toast;
import android.view.GestureDetector.OnGestureListener; public class MainActivity extends Activity implements OnTouchListener{public ImageView myImageView;private static final int NONE = 0;  private static final int DRAG = 1;  private static final int ZOOM = 2;  private int mode = NONE;  private Matrix tmpMatrix=new Matrix();;private Matrix savedMatrix = new Matrix();  private PointF startPoint = new PointF();  private PointF endPoint=new PointF();private PointF midPoint = new PointF();  private float oldDistance;  @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myImageView=(ImageView)findViewById(R.id.myImageView);myImageView.setOnTouchListener(this);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);return true;}@Overridepublic boolean onTouch(View v, MotionEvent event) {//获取触控的点数int pointCount = event.getPointerCount(); switch(event.getAction() & MotionEvent.ACTION_MASK){  //单手指按下 case MotionEvent.ACTION_DOWN:  //将当前的坐标保存为起始点  startPoint.set(event.getX(), event.getY());  tmpMatrix.set(myImageView.getImageMatrix()); savedMatrix.set(tmpMatrix);  mode = DRAG; break;  //第二根手指按下case MotionEvent.ACTION_POINTER_DOWN: oldDistance = (float) Math.sqrt((event.getX(0) - event.getX(1)) * (event.getX(0) - event.getX(1)) + (event.getY(0) - event.getY(1)) * (event.getY(0) - event.getY(1))); if (oldDistance > 10f) { savedMatrix.set(tmpMatrix); midPoint.set((event.getX(0) + event.getX(1))/2, (event.getY(0) + event.getY(1))/2);mode = ZOOM; } break; //指点杆保持按下,并且进行位移 case MotionEvent.ACTION_MOVE: //拖拽模式if (mode == DRAG) { tmpMatrix.set(savedMatrix); tmpMatrix.postTranslate(event.getX() - startPoint.x, event.getY() - startPoint.y); } //缩放模式else if (mode == ZOOM) { float newDist =  (float) Math.sqrt((event.getX(0) - event.getX(1)) * (event.getX(0) - event.getX(1)) + (event.getY(0) - event.getY(1)) * (event.getY(0) - event.getY(1)));  if (newDist > 10f){ tmpMatrix.set(savedMatrix); float scale = newDist / oldDistance; tmpMatrix.postScale(scale, scale, midPoint.x, midPoint.y); } } break;  //有手指抬起,将模式设为NONEcase MotionEvent.ACTION_UP:  case MotionEvent.ACTION_POINTER_UP:  mode = NONE;  break;  default:}          myImageView.setImageMatrix(tmpMatrix); return true;  }
}

代码解释:MainActivity实现OnTouchLietener的接口,将ImageView的触控 监听器设置为this,在重载函数OnTouch中实现对触控事件的处理。

这里的图像的位置和大小的变化都用到了矩阵运算,不太清楚的话可以先补充一下线性代数的知识。

拖拽的实现就是用矩阵记录手指移动的距离;缩放的时候,首先要记录两只手指最开始的距离,然后当手指移动的时候,实时计算出手指的距离,与之前的距离相除得到缩放的比例,然后用矩阵的scale方法存储。

函数的最后调用 setImageMatrix()来实现对TextView的缩放或移动。

二、手势识别

上面的例子虽然实现了基本的触控功能,而且低版本的系统也能很好的支持,但如果遇到了高级的触控事件,比如双击,长按之类,实现起来就非常麻烦了!

好在后续版本的api提供了更加棒的接口,我们可以很简单地来实现想要的效果。

这里要用到的是Android给我们提供的手势识别工具GestureDetector,需要2.2及以上的系统版本。

下面的例子实现的效果是:单点拖拽,滑动切换imageView的内容,两点缩放,双击图像改变图像显示状态。

效果:

package com.example.gesture;import java.util.Random;import android.os.Bundle;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ScaleGestureDetector.OnScaleGestureListener;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;public class MainActivity extends Activity {private GestureDetector myDetector;private Matrix matrix; private ImageView myImageView;private Random random;private ScaleGestureDetector mScaleGestureDetector;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myDetector=new GestureDetector(this,new MyGestureListener()); mScaleGestureDetector=new ScaleGestureDetector(this,new MyScaleGestureListener());matrix=new Matrix(); myImageView=(ImageView)findViewById(R.id.myImageView);random=new Random();}@Override  public boolean onTouchEvent(MotionEvent event) { int pointCount = event.getPointerCount(); if(pointCount==1)return myDetector.onTouchEvent(event);  else return mScaleGestureDetector.onTouchEvent(event);} private class MyGestureListener extends SimpleOnGestureListener{Matrix mMatrix=new Matrix();  PointF startPoint=new PointF();@Override  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  float distanceY) {  // TODO Auto-generated method stub mMatrix.set(myImageView.getImageMatrix());System.out.println("distanceX:"+distanceX+"distanceY:"+distanceY);  startPoint.set(e1.getRawX(), e1.getRawY());mMatrix.postTranslate(-distanceX,-distanceY); myImageView.setImageMatrix(mMatrix);return false;  }  @Override  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;  if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {  // Fling left  myImageView.setImageResource(R.drawable.pic0);				Toast.makeText(getApplicationContext(), "Fling Left", Toast.LENGTH_SHORT).show();  } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {  // Fling right  switch(random.nextInt(5)){case 0:myImageView.setImageResource(R.drawable.pic2);break;case 1:myImageView.setImageResource(R.drawable.pic3);break;case 2:myImageView.setImageResource(R.drawable.pic7);break;case 3:myImageView.setImageResource(R.drawable.pic5);break;case 4:myImageView.setImageResource(R.drawable.pic6);break;default:}Toast.makeText(getApplicationContext(), "Fling Right", Toast.LENGTH_SHORT).show();  }  return false;}  // 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发  public boolean onDown(MotionEvent arg0) {  Toast.makeText(getApplicationContext(), "onDown", Toast.LENGTH_SHORT).show(); return true;  }  @Overridepublic boolean onDoubleTap(MotionEvent e){if(myImageView.isShown())myImageView.setVisibility(View.INVISIBLE);else myImageView.setVisibility(View.VISIBLE);return false;		}}private class MyScaleGestureListener implements OnScaleGestureListener{private float oldDist;private float newDist;Matrix mMatrix = new Matrix();  @Overridepublic boolean onScale(ScaleGestureDetector detector) {// TODO Auto-generated method stubnewDist=detector.getCurrentSpan();mMatrix.set(myImageView.getImageMatrix()); //缩放比例//float scale = detector.getScaleFactor()/3;float scale=newDist/oldDist;System.out.println("scale:"+scale);//mMatrix.setScale(scale, scale,detector.getFocusX(),detector.getFocusY());mMatrix.postScale(scale, scale,detector.getFocusX(),detector.getFocusY());myImageView.setImageMatrix(mMatrix); oldDist=newDist;return false;}@Overridepublic boolean onScaleBegin(ScaleGestureDetector detector) {// TODO Auto-generated method stuboldDist=detector.getCurrentSpan();newDist=detector.getCurrentSpan();return true;}@Overridepublic void onScaleEnd(ScaleGestureDetector detector) {// TODO Auto-generated method stub}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);return true;}
}

代码解释:

这里我定义了两个GestrueListener,一个专门用于处理缩放的ScaleOnGestrueListener一个SimpleOnGestrueListener,当触控的点数为2的时候调用前者来处理,一般常用的手势用后者来处理。

原理和前面的差不多,只是调用不同的接口和不同的方法来实现,但是更加方便也更加清晰.

三、一点后记

学习Andorid中的某个类的时候,其实最好的方法是去看官方的API,有时候网上虽然有现成的代码给你,但实际运用的时候还是会有各种各样的问题,很多文章大都有雷同,甚至代码本身就有bug还往上粘,唉.....所以,最好还是自己踏踏实实研究。


http://www.lbrq.cn/news/2796391.html

相关文章:

  • 做游戏制作 网站产品关键词怎么找
  • 高端品牌网站建设定位不需要验证码的广告平台
  • 网站基础建设和维护网店推广方法有哪些
  • 网站设计哪家最好微信朋友圈广告怎么推广
  • 网站备案每年一次吗seo是搜索引擎优化吗
  • 正定网站建设制作公司泽成杭州seo网站推广排名
  • 郑州公司做网站汉狮软文代写价格
  • 赣州市做网站设计百度推广代理商查询
  • 模板网站开发定制网站seo报告
  • 厦门中科做网站总打电话来太原竞价托管公司推荐
  • 小程序制作平台代理重庆seo排名收费
  • 什么直播可以做游戏视频网站抖音推广平台
  • 网站关键词排名怎么做快速排名网站
  • 广东省示范校建设专题网站优秀软文范例800字
  • wordpress 学生惠州seo关键词推广
  • 给别人做网站别人违法经营6seo搜索优化公司报价
  • 类似b站的网站怎么做seo文章推广
  • 做文献综述用什么网站唯尚广告联盟app下载
  • 深圳做网站最好上海有哪些优化网站推广公司
  • 建设部人才网站九江seo公司
  • 常用的建站工具有哪些电商平台运营方案思路
  • 有什么做设计接任务的网站推广策划方案怎么做
  • 用php做的网站用什么数据库深圳靠谱网站建设公司
  • wordpress横线广州网站优化软件
  • wordpress增加论坛苏州seo公司
  • 诸城网站优化阿里域名购买网站
  • asp艺术学校网站源码济南seo外包服务
  • p2p网站建设价格百度正版下载恢复百度
  • 网站搭建论文app开发平台
  • 地图网站模板做网络推广可以通过哪些渠道推广
  • 深度卷积神经网络AlexNet
  • 2025-08-21 Python进阶1——控制流语句
  • 小程序开发APP
  • 当宠物机器人装上「第六感」:Deepoc 具身智能如何重构宠物机器人照看逻辑
  • day25|学习前端js
  • 【Python面试题】写一个用元类(metaclass)实现API接口自动注册的Demo。以及装饰器在项目中典型应用场景。