2015年10月30日 星期五

Android-曲線圖 折線圖

只要有關數據分析的 App 我相信一定對曲線圖不陌生吧
今天就來做一個簡易的 Sample ( 範例 )

首先分析順序 :

  1. 資料
  2. 曲線圖 折線圖 風格
  3. 放置目標


activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="@string/str_tv_title" />

    <LinearLayout
        android:id="@+id/chart_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_margin="8dip" >
    </LinearLayout>

</LinearLayout>


MainActivity.class
package com.example.ach;

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

import org.achartengine.ChartFactory;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    
    private View mChart;
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        List<String> list_D = new ArrayList<String>();
        for(int i = 0; i <10; i++){
            list_D.add("" + 100+i);
        }
        
        List<Integer> list_C = new ArrayList<Integer>();
        for(int i = 0; i <10; i++){
            list_C.add((int)(Math.random()*42+1));
        }
        
        LinearLayout chartContainer = (LinearLayout) findViewById(R.id.chart_container);
        chartContainer.addView(LineChartView.ChartView(MainActivity.this, "Hello", "Count", list_D, list_C));
                
    }    

}


LineCharView.class
package com.example.ach;

import java.util.List;

import org.achartengine.ChartFactory;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;

import android.content.Context;
import android.graphics.Color;
import android.view.View;

public class LineChartView {

    private static Context mContext;
    /**
     * 
     * @param chartTitle GraphTitle
     * @param XYSeries meaning of Series
     * @param list_Date X Data
     * @param list_Count Y Data
     * @return
     */
    public static View ChartView(Context context, String chartTitle, 
                String XYSeries, List<String> list_Date, List<Integer> list_Count) {
                    
        LineChartView.mContext = context;
        
        // 資料來源及命名
        XYSeries xySeries = new XYSeries(XYSeries);
        for(int i=0;i<list_Count.size();i++){
            xySeries.add(i+1, list_Count.get(i));
        }

        // Creating a dataset to hold each series
        XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
        // Adding Income Series to the dataset
        dataset.addSeries(xySeries);

        // 線的描述
        XYSeriesRenderer xySeriesRenderer = new XYSeriesRenderer();
        xySeriesRenderer.setColor(Color.RED);
        xySeriesRenderer.setChartValuesTextSize(40);// Value Text Size
        xySeriesRenderer.setPointStyle(PointStyle.CIRCLE);
        xySeriesRenderer.setFillPoints(true);
        xySeriesRenderer.setLineWidth(5);
        xySeriesRenderer.setDisplayChartValues(true);

        XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
        multiRenderer.setXLabels(0);
        multiRenderer.setChartTitle(chartTitle);
        multiRenderer.setChartTitleTextSize(40);
        multiRenderer.setXTitle("Date");// X Title
        multiRenderer.setYTitle("Count");// Y Title
        multiRenderer.setLabelsTextSize(40);// Label Text Size
        multiRenderer.setAxisTitleTextSize(40);// Axis Title Text Size
        multiRenderer.setZoomButtonsVisible(true);// Zoom?
        multiRenderer.setShowGrid(true);// show Grid
        for(int i=0; i<list_Date.size(); i++){
            multiRenderer.addXTextLabel(i+1, "" + list_Date.get(i).toString());
        }

        multiRenderer.addSeriesRenderer(xySeriesRenderer);

        View mChart = ChartFactory.getLineChartView(mContext, dataset, multiRenderer);

        return mChart;

    }

}


範例圖示 :























參考資料:MPAndroidChart
參考資料:MPAndroidChart 教程:概述
參考資料 : Android自定义控件 -Canvas绘制折线图(实现动态报表效果)
參考資料 : Android chart tutorial: AChartEngine - Line chart, Bar chart, Range bar
參考資料 : [Andriod] 透過AChartEngine實現BarChart
參考資料 : achartengine之折线图---简单用法

歡迎轉載,請註明出處。

2015年10月21日 星期三

ZigBee-簡介 說明

想投入IOT這塊一定對 : Zigbee 一定不陌生吧!
Zigbee 到底是什麼?

可以吃嗎?
生活中有嗎?
一些阿里不達的問題
.
.
.
.
之前我也思考很久
只知道一大堆的協定和一大堆看不懂的資料
但我只想簡單知道!!!

現在我來簡單的做整理
也會用簡單的圖示來呈現
希望各位能很快的漸入佳境

ZigBee : 一種傳輸協定( 例如 : 藍芽 )
傳輸距離 : 約 50 M
傳輸速率 : 250 kps
耗電 : 5 mA
好處 : 組網
型態 : coordinator 、router、end device
結構 : 樹狀

圖前解說 : 通常 Coordinator 用來接收所有裝置的封包( 有點像 : 頭目角色 )
                   所以一個族群裡只有一個頭目!

Coordinator 可串 Router 或 End Device
















Router 可串 : Router 或 End Device
End Device 不可串接















以下圖示是網路上常看到的
但現在改為顏色,好讓大家比較容易理解












如果看懂以上的圖
我想資訊網所提供的能更快速的理解。

Q&A 1 : 為什麼不 Router 和 End Device 全都接 Coordinator 就好 ?
A : 當然是可以的,但這不是 ZigBee 所樂見的。最終是要佈網才是他的優勢。

Q&A 2 : 如果以現實裝置來說,哪個是 Router? 哪個是 End Device?
A : 這個是好問題,這是由廠商來定義的。但這裡有分辨的小技巧,但還是
以原廠為主,看耗不耗電,如果需要用到插座通常是 Router ; 用電池供電通常
是 End Device 居多。

以上是個人的認知,如有錯誤
本人歡迎接受指教,謝謝大家

參考資料 : WiKi_ZigBee

歡迎轉載,請註明出處。

2015年10月19日 星期一

Android-Appium_腳本_執行順序

寫腳本的過程中
多少一定會有執行的順序
比如 : 
1_輸入帳號
2_輸入密碼
3_登入點擊
.
.
.
但是要怎麼寫程式才會乖乖地依序執行
@BeforeTest
@BeforeClass
@BeforeMethod
@testRegisterGateway
@AfterMethod
@AfterMethod
@AfterClass
@AfterTest

尚未完成

參考資料 : order of execution of tests in testng

2015年10月13日 星期二

Android-360混淆 Application

360 固仕 : 360加固保

各位大大如果完成自己 App 後
如果想上架
但又擔心自己的心血有心人反組譯
雖然混淆的方法有很多
但是 Dexguard 可以做混淆的動作
如果有第三方的 Jar 在編譯過程容易出錯
今天介紹 360
恩,不錯。

就是 360
這不是打廣告!
這不是打廣告!
這不是打廣告!


先提醒,此方法必須先上傳自己 APK 到 360 官網
等他編譯完再下載
如果真的有個人需求
這可能不符合你
所以真的想好後再去服用!!!

1 . 註冊帳號並且登入


 2 . 紅框框
下載應用程式
上傳開發者Apk
下載混淆後Apk


















3 . 開啟下載的檔案
注意 : 如有亂碼、空格請更改檔名,不然無法執行檔案。






4 . 將第 2 步處理好的Apk放置相關位置並且輸入 Keystone 相關資訊

















完成後就可以安心上架囉。



歡迎轉載,請註明出處。

2015年10月8日 星期四

2015年10月1日 星期四

Android-Appium 自動化測試 ( 三 )_Appium(舞台

當我們把腳本的執行檔案寫完後
舞台的特效就要開始做一些小小的設定















1 . 取得裝置序號
注意 : 必須是要打開開發者模式
命令提示字元打

adb kill-servier

adb devices


點選右鍵標註( 把序號反白複製 )

2 . 開啟 Appium 點擊 Android 圖示
將要測試的 APK 路徑寫入

選擇要測試的裝置 ( 二選一 )

* : 模擬器測試






















將Device Name : MyPhone 輸入在第二框框內

* : 裝置測試


現在將剛剛複製的裝置序號寫在第 2 框框內

3 . 點選設定按鈕
並且將紅色框框內的參數完整的輸入在框框內






















4 . 點選右上角執行



















等到以下程式 :

> info: Console LogLevel: debug

就可以等待連接了。
接下來我們可以做什麼 ?

1 . 藉由 Inspector Window 來查看元件屬性
2 . 執行我們所寫的腳本


之後全部的流程會在總結。

參考資料 : [Android] Appium 0.18.0 for Windows 新增的 Inspector 如何配置运行?
參考資料 : Android Automation using Appium in Windows
歡迎轉載,請註明出處。