官方文档概览,简单应用与分析

2019-07-19 11:02栏目:科技杂谈

话说这次 Computex 触摸屏幕玩最凶的,应该算是这家 KEYTEC 吧?他们这次一口气推出了三种不同的触摸操作或是电子白板替代输入技术。首先是 Magic Touch,基本上跟先前咱们˙Yeager 主编就报导过了类似的东西,简单说就是触摸屏幕的外挂框,而且是 LCD(6.4 寸到 21 寸,大型的有 27 寸到 80 寸)、CRT(17 or 19 寸)都有;另外一项则是上头的 OPTIR Touch,顾名思义就是透过 IR 感应的触摸技术;最后则是那个叫做 View Touch 的电子白板替代方案,原则上跟昨天看到的差不多,不过 KEYTEC 则是将这项技术应用在游戏上,跳转后有更详细的图片、影片介绍![KEYTEC bursts out 3 touch screens]KEYTEC is going big with alternative input devices like touch screens and electronic whiteboards. The picture above is showing OPTIR Touch with infrared sensing technologies. There is also Magic touch, a touch screen that can be overlaid onto conventional monitors, with sizes ranging from 6.4" to 21" and 27" to 80" for LCDs and 17" or 19" for CRTs. Last but not least, View Touch is an electronic whiteboard that is somewhat similar to the technology from MicroNix. All of there technology can be applied to gaming, which is a very attractive feature!

3.3D Touch Demo

以上讲的都是一些感念于效果表现,现在是代码层面的分析。主要是以下四种情况:

Home Screen Quick Actions​ (应用外的快速导航)

Static quick actions静态标签

Static quick actions are available to the userimmediately upon app installation. Define Home screen static quick actions in your app’sInfo.plistfile in theUIApplicationShortcutItemsarray.

就是在info.plist的文件中添加UIApplicationShortcutItems数组就可以使用了,具体数组里面的配置下面会有说明,还有一点需要强调的是,使用静态标签是程序安装以后就可以立即使用了。

UIApplicationShortcutItemType(required) 这个键值设置一个快捷通道类型的字符串

UIApplicationShortcutItemTitle(required) 这个键值设置标签的标题

UIApplicationShortcutItemSubtitle 设置标签的副标题

UIApplicationShortcutItemIconType 设置标签Icon类型

UIApplicationShortcutItemIconFile设置标签的Icon文件

UIApplicationShortcutItemUserInfo 设置信息字典(用于传值)

Dynamic quick actions动态标签

Dynamic quick actions are available to the userafter first launch. Define Home screen dynamic quick actions with theUIApplicationShortcutItem,UIMutableApplicationShortcutItem, andUIApplicationShortcutIconclasses. Add dynamic quick actions to your app’s shared UIApplication object using theshortcutItemsproperty.

动态标签是在程序初始化之后,才可以去配置的,UIApplicationShortcutItem, UIMutableApplicationShortcutItem, and UIApplicationShortcutIcon classes这3个类创建一个标签,UIApplication的shortcutItems管理整个app的标签。

动态标签需要注意的两点:1.动态的标签修改不了已有的静态标签2.动态标签初始化一次以后会保留在shortcutItems不需要每次都创建

Home Screen Quick Actions​的样式金沙国际官网,

金沙国际官网 1

标签的个数是有限制的,最多4个

图标在那边展示是系统根据当前app icon的位置决定的,会自动调整,图标只能使用系统的图片或者是打包在bundle中的图片。

Home Screen Quick Actions​的响应方法

类似推送,当我们点击标签进入应用程序时,也可以进行一些操作,我们可以在AppDelegate中增加了这样一个方法,在方法中可以做一些页面跳转等需求:

- (void)application:(UIApplication*)application performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem completionHandler:(void(^)(BOOL))completionHandler;

UIKit Peek and Pop

To supportpeek and popon 3D Touch-capable devices, the iOS 9 SDK includes:

New methods in theUIViewControllerclass forregisteringandunregisteringa view controller for participation in 3D Touch

New view controller protocols (UIViewControllerPreviewingDelegate) to support 3D Touch

To supportpeek quick actions, the iOS 9 SDK includes:

The newUIPreviewActionandUIPreviewActionGroupclasses

The newUIPreviewActionItemprotocol

增加了一个protocol UIViewControllerPreviewingDelegate

在UIViewController类中增加了注册和取消注册的Delegate的方法

具体看代码demo

Web View Peek and Pop

金沙国际官网 2

safari浏览器,3D Touch一个链接时

导入WebKit的文件,

创建一个WKWebView对象,设置allowsLinkPreview=true

WKWebView和SFSafariViewController#importWKWebView *webView =

[[WKWebView alloc]initWithFrame:self.view.bounds];

[self.view addSubview:webView];

[webView loadRequest:

[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"];

// 需要设置为true才有预览的功能

webView.allowsLinkPreview = true;

safari浏览器

Force Properties in UITouch Objects

3D Touch在UITouch类中增加了两个属性force​和maximumPossibleForce

The force of the touch, where a value of 1.0 represents the force of an average touch (predetermined by the system, not user-specific). (read-only)

Force反应当前压力的大小,1.0标示平均值。如果使用 Apple Pencil时,还需要计算altitudeAngle

*The maximum possible force for a touch. (read-only)
*

maximumPossibleForce是Force的最大值

如果你监控touchesBegan,touchesMoved,touchesEnded这3个放回就可以拿到UITouch,从而回到到这两个属性值。

金沙国际官网 3

使用UITouch中的3D Touch的force属性实现的画笔效果

自己写的demo,文中的展示的程序也使用了apple文档中的程序,以下的链接中找到。

写这篇文章时引用的资料链接

2015年苹果秋季新品发布会(中文翻译)

一张图让你了解3D Touch与Force Touch区别

Getting Started with 3D Touch

3D Touch开发初体验(模拟器使用3DTouch)

检测手势

  Android提供了GestureDetector 类来检测一般的手势。

  基本使用:

  1.生成GestureDetector 对象(或GestureDetectorCompat对象),构造时的参数传入监听器对象。

  监听器对象实现GestureDetector.OnGestureListener 接口。

  如果你仅仅是想利用其中的一些手势而不是全部,那么你可以选择继承GestureDetector.SimpleOnGestureListener类,这是一个适配器模式,即这个类实现了GestureDetector.OnGestureListener 接口,为其中所有的方法提供了空实现(返回值都是false),当继承GestureDetector.SimpleOnGestureListener类时,子类只需要覆写感兴趣的方法,其他方法是空实现。

  2.为了让 GestureDetector对象接收到事件,需要覆写View或Activity中的 onTouchEvent()方法,将事件传递给detector对象。

  一个例子:

金沙国际官网 4金沙国际官网 5

package com.example.hellogesturedetector;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.TextView;

public class HelloGestureDetectorActivity extends Activity {

    private static final String LOG_TAG = "HelloGesture";
    private GestureDetector mGestureDetector = null;

    private TextView mGestureTextView = null;
    private TextView mDoubleTapTextView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello_gesture_detector);

        mGestureTextView = (TextView) findViewById(R.id.gesture);
        mDoubleTapTextView = (TextView) findViewById(R.id.doubleTap);

        // 构造GestureDetector对象,传入监听器对象
        mGestureDetector = new GestureDetector(this, mOnGestureListener);

        // 传入双击监听器对象
        mGestureDetector.setOnDoubleTapListener(mDoubleTapListener);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 在onTouchEvent方法中将事件传递给手势检测对象,否则手势监听对象中的回调函数是不会被调用的
        mGestureDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    private OnGestureListener mOnGestureListener = new OnGestureListener() {

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            Log.i(LOG_TAG, "onSingleTapUp: "   e.toString());
            mGestureTextView.setText("onSingleTapUp: ");
            return false;

        }

        @Override
        public void onShowPress(MotionEvent e) {
            Log.i(LOG_TAG, "onShowPress: "   e.toString());
            mGestureTextView.setText("onShowPress: ");
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                float distanceX, float distanceY) {
            Log.i(LOG_TAG, "onScroll: "   e1.toString()   ", "   e2.toString());
            mGestureTextView.setText("onScroll ");
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            Log.i(LOG_TAG, "onLongPress: "   e.toString());
            mGestureTextView.setText("onLongPress: ");
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            Log.i(LOG_TAG, "onFling: "   e1.toString()   ", "   e2.toString());
            mGestureTextView.setText("onFling ");
            return false;
        }

        @Override
        public boolean onDown(MotionEvent e) {

            Log.i(LOG_TAG, "onDown: "   e.toString());
            mGestureTextView.setText("onDown: ");

            return false;

        }
    };

    private OnDoubleTapListener mDoubleTapListener = new OnDoubleTapListener() {

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.i("LOG_TAG", "onSingleTapConfirmed: "   e.toString());
            mDoubleTapTextView.setText("onSingleTapConfirmed: ");
            return false;
        }

        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.i("LOG_TAG", "onDoubleTapEvent: "   e.toString());
            mDoubleTapTextView.setText("onDoubleTapEvent: ");
            return false;
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Log.i("LOG_TAG", "onDoubleTap: "   e.toString());
            mDoubleTapTextView.setText("onDoubleTap: ");
            return false;
        }
    };
}

HelloGestureDetectorActivity.java

 

 

  根据官网上说:

  关于onDown())方法的返回值,最好是返回true,因为所有的手势都是从onDown())信息开始的。

  如果像 GestureDetector.SimpleOnGestureListener 默认实现一样返回false,系统就会认为你想要忽略之后的其他手势,然后GestureDetector.OnGestureListener 的其他方法就不会被调用。

  但是实际程序验证的时候,发现返回true还是false好像没有什么影响。(??)

 

首先是由小姜示范 OPTIR Touch

2.3D Touch应用场景分析

应用外的快速导航

在桌面时,用力按app icon,会弹出一个快速导航的列表,点击相应的选项会进入相应的页面

金沙国际官网 6

应用内的预览于选择

某音乐类APP 首页点击一个歌单,会有这个歌单的预览于一些操作

金沙国际官网 7

 

View Touch 模块跟枪结合

1.什么是3D Touch?

3D Touch属于一种人机交互的一种方式,具体点用户与手机屏幕的一种交互方式。在3D Touch出现前看看现有的一些用户与手机屏幕的交互方式有哪些?

现有的交互方式:点按,双击,长按,捏合,旋转,拖动,轻扫,快速滑动

官方介绍:iOS Human Interface GuidelinesBeta Gesture

总结以上的交互都是在一个二维的界面上根据接触的区域、时间、速度、方向,次数等维度,计算得出一种用户的手势操作

3D Touch是从一个新的维度出创建一种交互方式

3D Touch是触摸屏的压力感应功能。是在二维的Multi-Touch触摸屏基础上添加了可以对用户按压屏幕的力度大小作出响应于反馈的功能。3D Touch不是Apple的一个使用压力感应的产品,之前已经在MacBook和Apple Watch上使用,不过之前的叫Force Touch.Force Touch是3D Touch的雏形。他只可以区分轻触和重压。

官方介绍:iOS Human Interface GuidelinesBeta 3D Touch

这里提及一下Android平台上的压力感应功能。华为 128GB Mate S支持Force Touch技术,这是Force Touch 第一次应用在手机(比苹果还早,苹果之前使用在了电脑上)。Synaptics(新思国际)提供完整的解决方案Clear Force。

Android 触摸手势基础 官方文档概览

 

好玩吗?再来是 View Touch操作画面金沙国际官网 8操作系统遥控笔(黄色为低强度激光,红色为高强度,前者为激光笔用,后者提供感应摄影机捕捉光点,进而能够操作光标移动,透明笔头在接触墙面后,则可以书写、控制光标轨迹)金沙国际官网 9光点捕捉摄影机金沙国际官网 10再来是 View Touch在游戏上的应用

参考资料

  Training: Using Touch Gestures

  

 

滚动手势

  如果一个标准的布局有可能会超出它的容器的边界,可以把它嵌套在一个ScrollView中,这样就会得到一个可以滚动的布局,由framewok处理。

  实现一个自定义的scroller应该只在一些特殊情况下需要。

  Scroller用来随时间制造滚动动画,使用平台标准的滚动物理参数(摩擦力、速度等)。

  Scroller自己本身实际上并不绘制任何东西。

  Scroller记录滚动的偏移值,但是它并不会将这些位置应用到你的View,你需要自己动手。

  详见:

 

版权声明:本文由金沙国际登录网址发布于科技杂谈,转载请注明出处:官方文档概览,简单应用与分析