2016年1月30日 星期六

Android-Custom Dialog 客製化對話框

更新日期 : 20180224 新增 Styles.xml

Dialog 不僅只能用原生的元件
也可以針對自己想要的 UI 介面做開發
以下是客製化 Dialog 的範例 :






















以上是客製化視窗最常見的範例

接下來我們在客製化自己的 Dialog 吧 !

首先佈局好我們的UI

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:gravity="center">

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ImageView
            android:layout_width="160dp"
            android:layout_height="160dp"
            android:src="@mipmap/ic_launcher"
            android:id="@+id/dialog_image"/>

        <Button
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:text="X"
            android:id="@+id/dialog_btn"
            android:layout_gravity="right|top"/>
    </FrameLayout>

</LinearLayout>


MyDialod.java
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;


public class MyDialog implements DialogInterface.OnCancelListener, View.OnClickListener{

    private Context mContext;
    private int mResId;
    private Dialog mDialog;
    private ImageView dialog_image;
    private Button dialog_btn;

    MyDialog(Context context){
        this.mContext = context;
    }

    public MyDialog imageRes(int resId){
        this.mResId = resId;
        return this;
    }

    public MyDialog show(){
        mDialog = new Dialog(mContext, R.style.dialog);
        mDialog.setContentView(R.layout.dialog_mydialog);
        mDialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, 
            WindowManager.LayoutParams.MATCH_PARENT);

        // 點邊取消
        mDialog.setCancelable(true);
        mDialog.setCanceledOnTouchOutside(true);

        dialog_image = (ImageView)mDialog.findViewById(R.id.dialog_image);
        dialog_btn = (Button)mDialog.findViewById(R.id.dialog_btn);
        dialog_image.setImageResource(mResId);
        dialog_btn.setOnClickListener(this);
        mDialog.setOnCancelListener(this);
        mDialog.show();

        return this;
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        mDialog.dismiss();
    }

    @Override
    public void onClick(View v) {
        mDialog.dismiss();
    }
}


styles.xml
<style name="MyDialog" parent="Theme.AppCompat.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
</style>

在 Activity.java 使用
new MyDialog(this).imageRes(R.mipmap.ic_launcher).show();

2016年1月29日 星期五

Android-HorizontalScrollView 和 ViewPager 取代 Gallery

更新日期 : 20160227_範例程式

How use HorizontalScrollView or ViewPager replace Gallery?

常用於瀏覽圖片的元件 Gallery 已經宣告不建議使用
可以用 HorizontalScrollView 或 ViewPager
以下是官方連結 : Android Gallery

Gallery
This widget is no longer supported.
Other horizontally scrolling widgets include HorizontalScrollView
and ViewPager from the support library.

要用 Gallery ? 還是 HorizontalScrollView?
這沒有絕對的答案,這要見仁見智了。
接下來我們把畫面切成 : 上( ViewPager ) 、 下(HoriaontalScrollView )

操作方向 :
ViewPager : 將資料放置在選配器生成,讓 Adapter 配置成列表

HorizontalScrollView : 將資料來源佈局在 CustomView 上,再將 CustomView 塞
                                       至 ScrollView

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <android.support.v4.view.ViewPager
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/viewPager"/>

    </LinearLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <HorizontalScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/horizontalScrollView"
            android:layout_gravity="center">

            <LinearLayout
                android:id="@+id/linear_horizontal_scrollview"
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
            </LinearLayout>
        </HorizontalScrollView>
    </LinearLayout>

</LinearLayout>


MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity{

    private ViewPager viewPager;
    private MyPagerAdapter myPagerAdapter;
    private LinearLayout linear_horizontal_scrollview;

    private static final int[] pictures = { R.mipmap.image_1,
            R.mipmap.image_2, R.mipmap.image_3 };

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

        viewPager = (ViewPager)findViewById(R.id.viewPager);
        linear_horizontal_scrollview =
                (LinearLayout)findViewById(R.id.linear_horizontal_scrollview);

        // ViewPager
        List pictureList = new ArrayList<Integer>();
        for(int i: pictures)
        {
            pictureList.add(i);
        }
        pagerView(pictureList);

        // HorizontalScrollView
        for(int i: pictures)
        {
            linear_horizontal_scrollview.addView(insertImage(i));
        }

    }

    /**
     * ViewPager
     * @param list
     */
    private void pagerView(List<Integer> list){
        myPagerAdapter = new MyPagerAdapter(this, list);
        viewPager.setAdapter(myPagerAdapter);
    }

    /**
     *
     * @param path
     * @return
     */
    private View insertImage(int path){

        // 佈局
        LinearLayout layout = new LinearLayout(getApplicationContext());
        layout.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));
        layout.setGravity(Gravity.CENTER);
        layout.setPadding(10, 0, 10, 0);

        // 客製化 UI
        View child = getLayoutInflater().inflate(R.layout.cell_pager_image, null);
        ImageView imageView = (ImageView)child.findViewById(R.id.cell_imageView);
        imageView.setImageResource(path);
        layout.addView(child);

        // 程式編寫 UI
        /*
        ImageView imageView = new ImageView(getApplicationContext());
        imageView.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setImageResource(path);
        layout.addView(imageView);
        */

        return layout;
    }
}

MyPagerAdapter.java
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

import java.util.List;

public class MyPagerAdapter extends PagerAdapter {

    private Context context;
    private List<Integer> list;
    private LayoutInflater inflater;

    public MyPagerAdapter(Context context, List<Integer> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        inflater =
                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.cell_pager_image, container, false);

        ImageView imageView = (ImageView)itemView.findViewById(R.id.cell_imageView);
        imageView.setImageResource(list.get(position));

        (container).addView(itemView);

        return itemView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // Remove viewpager_item.xml from ViewPager
        container.removeView((LinearLayout) object);
    }

}

Demo 圖(一) 初始
























Demo 圖(二) 滑動
























但是各位有無發現
ViewPager : 可以置中,達到畫廊的效果,但是兩旁無前後預覽圖,感覺不逼真。
ScrollView : 雖然可以達到預覽的效果,但無法置中圖片

以上是針對這 Sample 做小小的結論
如果要達到畫廊的效果還是要針對元件做修正。

參考資料 : Android 使用HorizontalScrollView 实现Gallery效果
參考資料 : Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果

參考資料 : ANDROID HORIZONTALSCROLLVIEW WITH CENTER LOCK
參考資料 : How to create space between images in the gallery?

Android-Bottom Sheet 動畫特效(R.style)

如果常在使用手機因該有看過以下特效
此範例最大關鍵在於入場動畫、離場動畫與位置















首先在 res 底下建立 anim
入場動畫 popup_show.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromYDelta="100%p"
        android:toYDelta="0"
        android:duration="300"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
</set>


離場動畫 popup_hide.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromYDelta="0"
        android:toYDelta="100%p"
        android:duration="300"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
</set>


動畫設置
參考資料 : Android的Activity屏幕切换动画(二)-左右滑动深入与实战

風格設置
<!-- BottomSheetDialog 風格修改 -->
<style name="MaterialDialogSheet" parent="@android:style/Theme.Dialog">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowAnimationStyle">@style/MaterialDialogSheetAnimation</item>
</style>

<!-- 出入場動畫 -->
<style name="MaterialDialogSheetAnimation">
    <item name="android:windowEnterAnimation">@anim/popup_show</item>
    <item name="android:windowExitAnimation">@anim/popup_hide</item>
</style>

將 Dialog 套此風格就可以完成我們的主題
Dialog dialog = new Dialog(mContext, R.style.MaterialDialogSheet);


參考資料 : BottomSheet
參考資料 : Android How to implement Bottom Sheet from Material Design docs


參考資料 : MaterialDialogBottomSheet
( 簡易型 )

歡迎轉載,請註明出處。

2016年1月28日 星期四

Python-基本運算( 九 )_Set 集合

有幾個特性 :
1 . 不可重複
2 . 無順序性

格式 :
s = set(['Adam', 'Lisa', 'Bart', 'Paul']);

判斷值是否存在
print 'adam' in s

新增參數
s.add('Peter');

刪除參數
注意 : 要刪除前請先判斷,不然會報錯
s.remove('Lisa');

歡迎轉載,請註明出處。

RaspBerryPi-基本命令( Linux )

雖然 Raspberry Pi 已經是圖形化介面
但是骨子裡還是存在 Linux
有時反而下命令會更來的有效率
以下是比較常用的命令

檔案管理

指令行為
ls檔案
cd移動
mkdir建立目錄
cp檔案複製
rm檔案刪除
rmdir刪除目錄
mv檔案搬移
find尋找
df硬碟空間


系統管理

指令行為
sudo管理者
passwd修改密碼
adduser建立新的使用者
userdel刪除使用者
clear畫面清空
halt關機
shutdown關機
ps正在處裡的程序
Kill刪除系統中的程式

網路管理

指令行為
ifconfig網路狀況
ping連線狀況


歡迎轉載,請註明出處。

2016年1月26日 星期二

Python-基本運算( 八 )_Dict 集合

上一篇 : While 迴圈

接下來我們要介紹 : Dict
其實有點像是 Java 的 Map
{ "a" : 3 }
1. Key 不能重複
2 . 排列無順序性
3 . Key 必須為不可變的參數( ex : str、int ; list( 不可成為Key ) )
宣告方式為 : { ... } 不要搞混了

dict = {'A': 95, 'B': 85}

取得 A 值 :
dict.get("A");
95

更換 A 值 :
d["A"] = 50;

取得所有的 Key 和 Value
for key in dict:
    print key + ":" + str(dict.get(key));


歡迎轉載,請註明出處。

2016年1月23日 星期六

Python-基本運算( 七 )_While 迴圈

上一篇 : For 迴圈

這篇我們提到 : While 迴圈

黨然可以配 Break 和 Continue

a = 0;
while a < 10 :
    a = a + 1; // 空四格
    print a; // 空四格

歡迎轉載,請註明出處。

Python-基本運算( 六 )_For 迴圈

上一篇 : Tuple

前兩篇我們有提到陣列
但是陣列要怎麼用 For 迴圈顯示
不可能用 list[ 1 ] = ... 慢慢打吧

for value in list :
    print aaa; // 抬頭一定要空格
               // TODO2 ; 再按一次 Enter

注意 : 完畢後會出現  ..., 要再按一次Enter

至於我要怎麼自訂迴圈?
Python 有對應的API  : Range
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(0, -10, -1)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]

















歡迎轉載,請註明出處。

Python-基本運算( 五 )_Tuple

上一篇提到 :
這篇提到的是 : Tuple
他與 List 相像
但是經過初始化後不可再更改!!!
首先我們開啟 Python 環境
宣告方法
( .... )[ ... ]

tuple = ("Peter", 1, 5, "Tom");

注意 : 如果只有一個參數,後面一定要加 ","
















歡迎轉載,請註明出處。

2016年1月16日 星期六

Android-廣告 滑動頁面 ViewPager + PagerAdapter + 引導圖 (二)

上一篇 :
我們有提到怎麼使用 ViewAdapter

這篇我們要來簡單敘述說怎麼在畫面新增索引點
1 . 在原本佈局加上一個元件的佈局( LinearLayout )
2 . 新增 選取/被選取 圖示
3 . 依照數量創立出對應的 ImageView
4 . 將剛剛產生好了元件放置在佈局內( 1 )
5 . 在 PagerAdapter 設置 PagerSelected 監聽器

private void setPagerIndicator () {
         
      // 統計圖片數量
    dotsCount = myPagerAdapter.getCount();
    // 依照數量生成對應數量元件
    dots = new ImageView[dotsCount];
 
    // 在圖片元件放置對應的圖檔
    // 結束後,放在對應佈局元件內
    for (int i = 0; i < dotsCount; i++) {
        dots[i] = new ImageView(this);
        dots[i].setImageDrawable(getResources()
                .getDrawable(R.drawable.nonselecteditem_dot));
 
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
        );
       
        // 間距
        params.setMargins(4, 0, 4, 0);
        
        // 加載在佈局
        pager_indicator.addView(dots[i], params);
    }
 
    // 將第一點設定為初始點
    dots[0].setImageDrawable(getResources().getDrawable(R.drawable.selecteditem_dot));
}

@Override
public void onPageSelected(int position) {
    for (int i = 0; i < dotsCount; i++) {
        dots[i].setImageDrawable(getResources()
            .getDrawable(R.drawable.nonselecteditem_dot));
    }
    dots[position].setImageDrawable(getResources()
        .getDrawable(R.drawable.selecteditem_dot));
}



歡迎轉載,請註明出處。

RaspBerryPi-從無到有

今天收到新玩具 : Raspberry Pi 2
我們開始吧

先簡單描述這台小機器吧 !!!
簡單的說,他是一台小電腦
但是走 Linux 系統的

事前準備 :
1 . mircoSD 8G up
2 . Raspberry Pi 2

流程
1 . 下載作業系統( Raspbian )
Raspberry Pi Raspbian 作業系統

2 .格式化 SD 卡
下載官方格式化軟體

格式化選項設定
1 ) 快速格式化 : 重新排列,但內部資料有機率回朔
2 ) 複寫格式化 : 完整清除內部資料















3 . 下載 映像檔燒入在 SD 的工具




4 . 開啟燒入工具,開始燒入
Write : 燒入
Read : 讀取( 備份映像檔 )














歡迎轉載,請註明出處。


2016年1月9日 星期六

Android-How import aar in the project

If you have aar or jar in project's libs
You must add text on build.gradle

This example :
.
.
.
repositories {
    jcenter()
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}
.
.
.
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile (name:'the-hello-world-aar', ext:'aar')
}
.
.
.


歡迎轉載,請註明出處。

2016年1月7日 星期四

Android-感應器

甩動
參考資料 : Android: I want to shake it

手機面朝下
float z = sensorEvent.values[2];
if (event.values[2] < 0)
{
  // doSomething
} 

2016年1月6日 星期三

Android-Bitmap 圖片編輯

Resources 轉 Drawable
Drawable d = getResources().getDrawable(R.drawable.icon);

Resources 轉 Bitmap
Bitmap mBitmap = BitmapFactory.decodeResource(this.getResources(), 
                R.drawable.test_image);


Drawable 轉 Bitmap
public static Bitmap drawableToBitmap (Drawable drawable) {
    Bitmap bitmap = null;

    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        if(bitmapDrawable.getBitmap() != null) {
            return bitmapDrawable.getBitmap();
        }
    }

    if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); 
    } else {
        bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), 
            drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    }

    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

Bitmap 轉 Drawable
Drawable d = new BitmapDrawable(getResources(), bitmap);

使用 Bitmap 更改長寬
public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
    return resizedBitmap;
}

使用 Bitmap 使兩張圖片置中
private Bitmap mergeBitmap(Bitmap firstBitmap, Bitmap secondBitmap) {
    Bitmap bitmap = Bitmap.createBitmap(firstBitmap.getWidth(), firstBitmap.getHeight(),
               firstBitmap.getConfig());
    Canvas canvas = new Canvas(bitmap);
    int firstWidth = firstBitmap.getWidth();
    int firstHeight = firstBitmap.getHeight();
    int secondWidth = secondBitmap.getWidth();
    int secondHeight = secondBitmap.getHeight();
    canvas.drawBitmap(firstBitmap, new Matrix(), null);
    canvas.drawBitmap(secondBitmap, firstWidth/2-secondWidth/2, 
        firstHeight/2-secondHeight/2, null);
    return bitmap;
}

使用 Bitmap 旋轉圖片
private Bitmap rotateImage(Bitmap bitmap, float rotate){
    Matrix matrix = new Matrix();
    matrix.setRotate(rotate);
    return Bitmap.createBitmap(bitmap, 0, 0, 
        bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}


參考資料 : How to convert a Drawable to a Bitmap?

Android-圖片等比放大

圖片等比放大,對齊螢幕寬

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:maxHeight="4000dp"
    android:maxWidth="1000dp" />

參考資訊 : [Android界面] 关于ImageView保持图片比例的问题
參考資訊 : 【Android】ImageView 圖片顯示寬度佔滿全屏 (adjustViewBounds)

Android-讀寫圖片檔案( Read / Write image in the file )

讀取圖片檔案
private Bitmap decodeFile(File f){
    Bitmap b = null;
    try {

        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        FileInputStream fis = new FileInputStream(f);
        BitmapFactory.decodeStream(fis, null, o);
        fis.close();

        int scale = 1;
        // IMAGE_MAX_SIZE
        if (o.outHeight > IMAGE_MAX_SIZE  || o.outWidth > IMAGE_MAX_SIZE) {
            scale = (int)Math.pow(2, (int) Math.ceil(Math.log(IMAGE_MAX_SIZE  /
                    (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
        }

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        fis = new FileInputStream(f);
        b = BitmapFactory.decodeStream(fis, null, o2);
        fis.close();
    } catch (IOException e) {
        Log.i("EnsoulCamera", "decodeFile : " + e.toString());
    }
    return b;
}



2016年1月5日 星期二

Android-GPS 定位取得 經度 緯度( 二 )

上一篇 : Android-GPS 定位取得 經度 緯度( 一 )
來取得現在的經緯度
但是雖然非常快速又方便
但只要網路品質不佳一些外在因素
很容易取得到 ( 0.0 , 0.0 )
這篇則是註冊監聽器回調的方式來取得經緯度
雖然回應不是即時的
但相對前者更佳準確

1 . 首先註冊權限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

2 . 取得 LocationManaget
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

3 . 註冊監聽器
設定更新的參數
private static final long MIN_TIME = 0;
private static final float MIN_DUSTANCE = 5;

GPS 裝置提供的位置
try {
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
        MIN_TIME, MIN_DUSTANCE, this);
} catch (IllegalArgumentException e) {
    e.getStackTrace();
}

網路裝置提供的位置
try {
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
        MIN_TIME, MIN_DUSTANCE,this);
} catch (IllegalArgumentException e) {
    e.getStackTrace();
}

4 . 記得要實作 LocationListener
@Override
public void onLocationChanged(Location location) {
    double latitude = location.getLatitude();
    double longitude = location.getLongitude();
}

5. 最後,記得解綁監聽
try {
    locationManager.removeUpdates(this);
} catch (IllegalArgumentException e) {
    e.getStackTrace();
}



歡迎轉載,請註明出處。

2016年1月3日 星期日

Android-GPS 定位取得 經度 緯度( 一 )

簡單取得 手機 經度 緯度

經度( Longitude )
緯度( Latitude )

1 . 新增對應的權限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

2 . 取得系統服務
LocationManager mLocationManager = 
        (LocationManager) getSystemService(LOCATION_SERVICE);

3 . 判斷手機狀態並且取得參數
// 判斷目前裝置是否提供 GPS 服務 
if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || 
        mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
    Location location = 
            mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            
    if(location != null) 
    {
        //經度
        Double longitude = location.getLongitude();    
        //緯度
        Double latitude = location.getLatitude();    
    }          
} 
else 
{
    // 引導到設定請使用者開啟 GPS 服務
    startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));    
}

歡迎轉載,請註明出處。

Android-拍照_預覽 ( 一 )

利用 Camera + SurfaceView 達到拍照的效果

為了加快上手的速度
先舉簡單的例子和圖片

想像現在情境 : 拍電影

如果要演一齣戲需要的是??
演員?編劇?導演?設備?...等

對,就是設備 !!!
Camera : 攝影機
SurfaceHolder : 幕後處理...等
SurfaceView : 我們的在電視上所看到的畫面

1 . 為了要看到最新內容
     所以我們將內容串接在幕後製作

2 . 如果有些效果能直接拍出來
     那為啥麼不直接在攝影機做調整?

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

</RelativeLayout>


import java.io.IOException;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainActivity extends Activity implements SurfaceHolder.Callback{

    private Camera mCamera;
    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;

    private boolean isOpen;

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

        mSurfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

    @Override
    protected void onResume() {
        super.onResume();
        mCamera = Camera.open();
        if (mCamera != null){
            try {
                mCamera.setPreviewDisplay(mSurfaceHolder);
                mCamera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mCamera != null){
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder){
        try
        {
            mCamera = Camera.open();
            mCamera.setPreviewDisplay(mSurfaceHolder);
            mCamera.setDisplayOrientation(90);
        }
        catch (IOException e)
        {
            mCamera.release();
            mCamera = null;
        }
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setFocusMode("auto");
        mCamera.setParameters(parameters);
        mCamera.startPreview();
        isOpen = true;

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
        mCamera.stopPreview();
        isOpen = false;
        mCamera.release();
        mCamera = null;

    }
}

參考資料 : [Android] 相機自動定焦拍照(Camera Preview)

歡迎轉載,請註明出處。

2016年1月2日 星期六

Android-Caemer2

參考資訊 :  Android L Camera2 API sample ver1 - startPreview

Android-IFTTT

IFTTT
IFTTT Maker

藉由 IFTTT Maker 串接到手機的服務
1 . 註冊成 IFTTT 的會員
2 . 前往 IFTTT Maker 新增服務
3 . 簡易說明














4 . 網頁向下拖曳後點選 ( Receiver a web request )














5 . 新增菜單服務














6 . 此範例 Maker -> Evernote,我們點選 this














7 . 點選 Maker 服務














8 .














9 . 幫此事件定義名稱( 後續API與此名稱有關 )














10 . 定義觸發後的行為














11 . 用 Evernote 為範例,點選後會有一長串的認證授權














12 . Evernote 提供的服務,這裡已一般的建立筆記當範例














13 . 定義後續建立筆記的參數
這裡會隨著不同服務會提供不同的格式














14 . 核對內容














15 . 返回到 IFTTT Maker














16 . 將剛剛命名好的事件名稱寫在 Event 內,並帶入所需要的參數
頁面底部有 API,只要發送此API,就會執行剛剛定義好的菜單














歡迎轉載,請註明出處。