2013年12月18日星期三

谷歌時代精神 - Here's to 2013

Google Zeitgeist | Here's to 2013

2013年時代精神. 認識世界搜索了什麼, 與谷歌的一年回顧.
http://www.google.com/zeitgeist

2013年12月10日星期二

2013年12月8日星期日

實現 GestureDetector.OnGestureListener 檢測手勢

這個示例代碼通過實現 GestureDetector.OnGestureListener 檢測用戶的手勢操作:
實現 GestureDetector.OnGestureListener 檢測手勢
實現 GestureDetector.OnGestureListener 檢測手勢

package com.example.androidgesturedetector;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.GestureDetectorCompat;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.TextView;

public class MainActivity extends Activity {

 String info;
 TextView infoView;
 private GestureDetectorCompat myGestureDetectorCompat;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // setContentView(R.layout.activity_main);
  infoView = new TextView(this);
  setContentView(infoView);

  info = "";
  infoView.setText(info);

  myGestureDetectorCompat = new GestureDetectorCompat(this,
    myOnGestureListener);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  myGestureDetectorCompat.onTouchEvent(event);
  return super.onTouchEvent(event);
 }

 GestureDetector.OnGestureListener myOnGestureListener = new 
   GestureDetector.OnGestureListener() {

  @Override
  public boolean onDown(MotionEvent e) {
   info = "onDown - " + e.getX() + " : " + e.getY() + "\n";
   infoView.setText(info);
   return false;
  }

  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
    float velocityY) {
   info += "onFling - " + "\n" + " e1 - " + e1.getX() + " : "
     + e1.getY() + "\n" + " e2 - " + e2.getX() + " : "
     + e2.getY() + "\n" + " velocityX = " + velocityX + "\n"
     + " velocityY = " + velocityY + "\n";
   infoView.setText(info);
   return false;
  }

  @Override
  public void onLongPress(MotionEvent e) {
   info += "onLongPress - " + e.getX() + " : " + e.getY() + "\n";
   infoView.setText(info);
  }

  @Override
  public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
    float arg3) {
   info += "onScroll\n";
   infoView.setText(info);
   return false;
  }

  @Override
  public void onShowPress(MotionEvent e) {
   info += "onShowPress - " + e.getX() + " : " + e.getY() + "\n";
   infoView.setText(info);
  }

  @Override
  public boolean onSingleTapUp(MotionEvent e) {
   info += "onSingleTapUp - " + e.getX() + " : " + e.getY() + "\n";
   infoView.setText(info);
   return false;
  }
 };

}


相關帖子:
- 手勢檢測 GestureDetector.SimpleOnGestureListener

2013年12月2日星期一

手勢檢測 GestureDetector.SimpleOnGestureListener

GestureDetector.SimpleOnGestureListener 類為檢測手勢(Gesture)提供一種簡單的方式. 它實現了 GestureDetector.OnGestureListener 和 GestureDetector.OnDoubleTapListener 的所有方法. 你只需要擴展 GestureDetector.SimpleOnGestureListener 子類,並重寫所需的方法便可以。

返回值: 如果該事件被消耗掉 return true,否則 return false.

示例代碼:

package com.example.androidsimpleongesturelistener;

import android.os.Bundle;
import android.support.v4.view.GestureDetectorCompat;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {
 
 private GestureDetectorCompat myGestureDetector;
 String info;
 TextView infoView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //setContentView(R.layout.activity_main); 
  infoView = new TextView(this);
  setContentView(infoView);

  info = "";
  infoView.setText(info);
  
  myGestureDetector = 
    new GestureDetectorCompat(this, new MyGestureListener());
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  this.myGestureDetector.onTouchEvent(event);
  return super.onTouchEvent(event);
 }

 class MyGestureListener extends GestureDetector.SimpleOnGestureListener {

  @Override
  public boolean onDoubleTap(MotionEvent e) {
   info += "onDoubleTap - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   return super.onDoubleTap(e);
  }

  @Override
  public boolean onDoubleTapEvent(MotionEvent e) {
   info += "onDoubleTapEvent - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   return super.onDoubleTapEvent(e);
  }

  @Override
  public boolean onDown(MotionEvent e) {
   info = "onDown - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   return super.onDown(e);
  }

  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
    float velocityY) {
   info += "onFling - " + "\n" +
     " e1 - " + e1.getX() + " : " + e1.getY() + "\n" +
     " e2 - " + e2.getX() + " : " + e2.getY() + "\n" +
     " velocityX = " + velocityX + "\n" +
     " velocityY = " + velocityY + "\n";
   infoView.setText(info);
   return super.onFling(e1, e2, velocityX, velocityY);
  }

  @Override
  public void onLongPress(MotionEvent e) {
   info += "onLongPress - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   super.onLongPress(e);
  }

  @Override
  public boolean onScroll(MotionEvent e1, MotionEvent e2,
    float distanceX, float distanceY) {
   /*
   info += "onScroll - " + "\n" +
     " e1 - " + e1.getX() + " : " + e1.getY() + "\n" +
     " e2 - " + e2.getX() + " : " + e2.getY() + "\n" +
     " distanceX = " + distanceX + "\n" +
     " distanceY = " + distanceY + "\n";
   infoView.setText(info);
   */
   info += "onScroll\n";
   infoView.setText(info);
   return super.onScroll(e1, e2, distanceX, distanceY);
  }

  @Override
  public void onShowPress(MotionEvent e) {
   info += "onShowPress - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   super.onShowPress(e);
  }

  @Override
  public boolean onSingleTapConfirmed(MotionEvent e) {
   info += "onSingleTapConfirmed - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   return super.onSingleTapConfirmed(e);
  }

  @Override
  public boolean onSingleTapUp(MotionEvent e) {
   info += "onSingleTapUp - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   return super.onSingleTapUp(e);
  }
 }
}


手勢檢測 GestureDetector.SimpleOnGestureListener
手勢檢測 GestureDetector.SimpleOnGestureListener


相關帖子:
- 實現 GestureDetector.OnGestureListener 檢測手勢

2013年11月2日星期六

Android 4.4 KitKat 新功能介紹

此播放列表介紹一些 Android4.4 KitKat 的新功能:

2013年10月24日星期四

Play Games 與 NDK

下面三個視頻教程介紹如何整合 NativeActivity 與 NDK, 使用C++ 編寫遊戲程式.

設定:


成勣和排行榜:


線程和生命週期:


2013年10月11日星期五

Density-independent Pixels (密度獨立像素)

一個教導如何針對不同Android設備, 不同分辨率的問題, 創建統一用戶界面(UI)的視頻教程.

DesignBytes: Density-independent Pixels


This introductory video explains how Android app designers can easily work across different screen pixel densities by using the density-independent pixel (abbreviated dp or dip), a virtual pixel unit that keeps things the same physical size across device. Understanding dp units is critical to a successful Android app design workflow.