2013年5月16日 星期四

Android程式設計 - 使用Fluid UI工具與用戶溝通

用戶溝通與需求訪談是系統開發初期最重要的事項,妥善運用Wireframe工具可大幅縮短溝通時程,降低功能認知落差,針對Apps開發,Fluid UI是一款方便實用的線上Wireframe & Prototype工具,可快速建構Android, iOS and Windows 8 apps趨型。
https://www.fluidui.com/editor/live/


2013年5月10日 星期五

Android程式設計 - Google Maps API v2在地圖上繪圖

程式中可在Google Map上繪製連續線、圓形及多邊形,且繪製的幾何圖形會自動隨地圖縮放調整比例。
GoogleMap.addPolyline()方法用來在地圖上描繪連續線段。
GoogleMap.addPolygon()方法用來在地圖上描繪多邊形。
GoogleMap.addCircle()方法用來在地圖上描繪圓形。
例如:

  m_map = ((SupportMapFragment)
      getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  LatLng p1 = new LatLng(23.95616, 120.68509);
  LatLng p2 = new LatLng(23.95666, 120.68585);
  LatLng p3 = new LatLng(23.95836, 120.68732);
     m_map.addPolyline(new PolylineOptions().
       add(p1, p2, p3).
       width(5).
       color(Color.LTGRAY).
       geodesic(true));
     m_map.addCircle(new CircleOptions().
       center(p1).
       radius(10).
       strokeWidth(5).
       strokeColor(Color.RED));
     m_map.addCircle(new CircleOptions().
       center(p2).
       radius(10).
       strokeWidth(5).
       strokeColor(Color.RED));
     m_map.addCircle(new CircleOptions().
       center(p3).
       radius(10).
       strokeWidth(5).
       strokeColor(Color.RED));



2013年5月9日 星期四

Android程式設計 - Google Maps API v2自訂地標訊息視窗

預設的地標訊息titlesnippet都只能顯示單行文字,當文字訊息過長時,後面的部份就只顯示「」而看不到完整的文字內容。
要自訂地標訊息視窗樣式,首先必須為地標訊息視窗設計所需的版面配置,例如使用一個圖示與二個文字方塊做為地標訊息視窗版面。



接著為GoogleMap設計一個Adapter類別,在該類別的getInfoContents()方法中,將所要顯示的地標titlesnippet內容設定到自訂的地標訊息視窗版面元件中。
class MyInfoWindowAdapter implements InfoWindowAdapter {
  @Override
  public View getInfoContents(Marker marker) {
     // 依指定layout檔,建立地標訊息視窗View物件
     View infoWindow = getLayoutInflater().inflate(R.layout.my_infowindow, null);
     // 顯示地標title
     TextView title = ((TextView)infoWindow.findViewById(R.id.txtTitle));
     title.setText(marker.getTitle());
     // 顯示地標snippet
    TextView snippet = ((TextView)infoWindow.findViewById(R.id.txtSnippet));
     snippet.setText(marker.getSnippet());
     return infoWindow;      
  }
  ...
}
最後設定GoogleMap使用自訂的MyInfoWindowAdapter物件做為地標訊息視窗轉接器。
    m_map.setInfoWindowAdapter(new MyInfoWindowAdapter());


2013年5月8日 星期三

Android程式設計 - 如何中止Thread

程式中時需要使用multithread進行背景作業, 但記得必須在程式結束前中止Thread。
查閱文件會發現不論destroy()方法或stop()方法都已聲明不應用來終止thread,而interrupt()方法也並不是用來終止thread。那麼到底該如何正確在應用程式結束時一併終止所建立的Thread,正確的作法是使用interrupt()方法並配合shared variable控制


  boolean RUN_THREAD = true;
  ...


  ocrThread = new Thread(){
    public void run(){
       while (RUN_THREAD){
         //執行緒作業
       }
    }
  };
  ocrThread.start();
  ...
  protected void onDestroy() {
      RUN_THREAD = false;
      ocrThread.interrupt();
      ocrThread = null;
  } 

2013年5月7日 星期二

Android程式設計 - Google Maps API v2 可拖曳地圖地標

若要允許使用者移動地圖上的地標,則地標之draggable屬性必須設定為true,並實作GoogleMap之OnMarkerDrag事件監聽器。

OnMarkerDrag事件監聽器有三個回呼方法,onMarkerDragStart()、onMarkerDrag()及onMarkerDragEnd(),如果沒有特別需求,就維持原程式框架即可。

使用者只要按住地標一段時間,地標就會浮起,之後就可開始拖曳調整地標位置。

  m_map = ((SupportMapFragment)
     getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  MarkerOptions marker2 = new MarkerOptions().
     position(new LatLng(23.95616, 120.68509)).
     title("椰林大道荷花香").
     snippet("休閒散心的景觀步道,兩側高大的大王椰子樹,樹下緊傍著荷花相伴").
     draggable(true).
     icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker2));
  m_map.addMarker(marker2);
  m_map.setOnMarkerDragListener(new OnMarkerDragListener(){
     @Override
     public void onMarkerDrag(Marker arg0) {}
     @Override
     public void onMarkerDragEnd(Marker arg0) {}
     @Override
     public void onMarkerDragStart(Marker arg0) {}
     });

Android程式設計 - Google Maps API v2 地圖地標

地圖標記方便我們在地圖的特定位置加上記號,讓重要地標在地圖上一目了然。
程式中可使用GoogleMap.addMarker()方法在地圖上加上地標,當使用者點擊地標時即會顯示地標中的訊息。
l Marker GoogleMap.addMarker(MarkerOptions options)
依據MarkerOptions物件內容,在地圖加上地標。
options            MarkerOptions物件,用來描述地標內容。
地標內容是以MarkerOptions物件來描述,包括以下屬性:
position    LatLng物件,放置地標的地圖座標,此為必要項。
title           地標名稱,當使用者點擊地標時,會開啟訊息視窗顯示標題。
snippet     地標之附加說明文字,會顯示在標題文字下方。
draggable 是否允許使用者拖曳地標,預設值為false。
visible      是否顯示地標,預設值為true。
anchor   地標圖示與position座標值位置之對齊方式,預設是將地標圖示下緣中央貼齊position座標值。
icon         BitmapDescriptor物件,用來描述做為地標圖案之圖示。
例如下列程式碼在地圖中加入1個地標:
  m_map = ((SupportMapFragment)
     getSupportFragmentManager().findFragmentById(R.id.map)).getMap();  
  MarkerOptions marker1 = new MarkerOptions().
     position(new LatLng(23.95666, 120.68585)).
     title("中興新村牌樓").
     snippet("雙十造型牌樓,是中興新村的門戶景觀,也是進入中興新村的指標").
     icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker));
  m_map.addMarker(marker1);     



2013年5月3日 星期五

Android程式設計 - Google Maps API v2 地圖定位

使用My location圖層是最簡便的定位方式,其概念像是在地圖上覆蓋透明圖層,當我們啟用my-location圖層後,定位點內容自然會疊覆到地圖上。
程式中可使用GoogleMap.setMyLocationEnabled()方法來開啟或關閉My location圖層。例如:
  GoogleMap m_map = ((SupportMapFragment)
     getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  m_map.setMyLocationEnabled(true);


2013年5月2日 星期四

Android程式設計 - Google Maps API v2 變更地圖檢視模式


GoogleMap物件支援一般地圖(就是大家常用的道路地圖)、衛星地圖、及地形圖,預設是顯示道路地圖,程式中可使用setMapType ()來設定顯示模式。
l void GoogleMap.setMapType (int type)
指定LatLng座標物件及地圖縮放值,建立CameraUpdate物件。
type                 地圖顯示模式代碼,有效設定值如下:
                        GoogleMap.MAP_TYPE_NORMAL       道路地圖。
                        GoogleMap.MAP_TYPE_SATELLITE    衛星空照圖。
                        GoogleMap.MAP_TYPE_TERRAIN       地形圖。
                        GoogleMap.MAP_TYPE_HYBRID         道路地圖混合空照圖。
例如下列程式碼設定顯示地形圖:
  GoogleMap map = ((SupportMapFragment)
     getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);




Android程式設計 - Google Maps API v2 調整地圖中心點

地圖座標是使用LatLng物件來表示,LatLng建構子第一個參數表示緯度值,第二個參數表示經度值。例如:

  LatLng nkut = new LatLng(23.97918, 120.69686);

程式中可直接使用GoogleMap物件之moveCamera(CameraUpdate update)方法或animateCamera(CameraUpdate update)方法來移動地圖鏡頭到指定座標點,差別在於animateCamera()會有地圖移動效果。
在上述方法中,update為地圖鏡頭動作物件,必須使用CameraUpdateFactory類別建構CameraUpdate物件。最簡單的方式是使用CameraUpdateFactory.newLatLng (LatLng latLng),例如:


  GoogleMap map = ((SupportMapFragment)
    getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  LatLng nkut = new LatLng(23.97918, 120.69686);
  map.moveCamera(CameraUpdateFactory.newLatLng(nkut)); 

CameraUpdateFactory.newLatLngZoom()方法除了指定地圖中心LatLng座標,還同時設定地圖縮放等級。例如:

  GoogleMap map = ((SupportMapFragment)
    getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  LatLng nkut = new LatLng(23.97918, 120.696867);
  map.moveCamera(CameraUpdateFactory.newLatLngZoom(nkut,15.0f));