2014年11月25日 星期二

[Android] MPAndroidChart 圖表製作

資料來源 https://github.com/PhilJay/MPAndroidChart

網路上其實已經有很多這類的相關資訊了,但是找了很久,要不就是很複雜,要不就是很簡陋,就好像只有點到而已,所以在這邊做一個很簡單的示範,就獻醜了!!

效果顯示



XML內容

<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"
    tools:context="com.guider.chartmp.MainActivity" >


      <com.github.mikephil.charting.charts.LineChart
          android:id="@+id/chart"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />


</RelativeLayout>


code 內容

public class MainActivity extends Activity {
LineChart chart;
ArrayList <String> xVals = new ArrayList<String>();
ArrayList <String> yVals = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chart = (LineChart) findViewById(R.id.chart);
chart.setDescription("說明文字");
chart.fitScreen();
LineData data = getData(12, 100);
chart.setData(data);

}

    protected String[] mMonths = new String[] {
            "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
    };
private LineData getData(int count, float range) {
// TODO Auto-generated method stub
      ArrayList<String> xVals = new ArrayList<String>();
       for (int i = 0; i < count; i++) {
           xVals.add(mMonths[i % 12]);
       }

       ArrayList<Entry> yVals = new ArrayList<Entry>();

       for (int i = 0; i < count; i++) {
           float val = (float) (Math.random() * range) + 3;
           yVals.add(new Entry(val, i));
       }

       // create a dataset and give it a type
       LineDataSet set1 = new LineDataSet(yVals, "DataSet 1");
       set1.setLineWidth(5);
       set1.setCircleSize(3f);
       set1.setColor(Color.BLUE);
       set1.setCircleColor(Color.BLUE);
       set1.setHighLightColor(Color.BLUE);

       ArrayList<LineDataSet> dataSets = new ArrayList<LineDataSet>();
       dataSets.add(set1); // add the datasets

       // create a data object with the datasets
       LineData data = new LineData(xVals, dataSets);
return data;
}
}

完整程式下載 : https://drive.google.com/open?id=0B2WSxYpFVHkaS3VsS2dTQTlfNEE&authuser=0

2014年11月18日 星期二

[Android] 使用預設的listView

參考網址 : http://givemepass.blogspot.tw/2011/11/listview.html

[Android] 自定義listView 方法二

稍晚整理....

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/MyListItem"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingBottom="3dip"
    android:paddingLeft="10dip" >

            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="時間" />
    <View   
       android:layout_width="1.5dip"  
       android:layout_height="fill_parent"  
       android:background="#f9b68b"/>  
            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/HR_heart_rate_text" />
    <View   
       android:layout_width="1.5dip"  
       android:layout_height="fill_parent"  
       android:background="#f9b68b"/> 
            <TextView
                android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/HR_risk_text" />
    <View   
       android:layout_width="1.5dip"  
       android:layout_height="fill_parent"  
       android:background="#f9b68b"/> 
            <TextView
                android:id="@+id/textView4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/HR_relax_text" />
    <View   
       android:layout_width="1.5dip"  
       android:layout_height="fill_parent"  
       android:background="#f9b68b"/> 
            <TextView
                android:id="@+id/textView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/HR_breathe_rate_text" />

</LinearLayout> 




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

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.5" >

            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="時間" />
    <View   
       android:layout_width="1.5dip"  
       android:layout_height="fill_parent"  
       android:background="#f9b68b"/>  
            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/HR_heart_rate_text" />
    <View   
       android:layout_width="1.5dip"  
       android:layout_height="fill_parent"  
       android:background="#f9b68b"/> 
            <TextView
                android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/HR_risk_text" />
    <View   
       android:layout_width="1.5dip"  
       android:layout_height="fill_parent"  
       android:background="#f9b68b"/> 
            <TextView
                android:id="@+id/textView4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/HR_relax_text" />
    <View   
       android:layout_width="1.5dip"  
       android:layout_height="fill_parent"  
       android:background="#f9b68b"/> 
            <TextView
                android:id="@+id/textView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/HR_breathe_rate_text" />

        </LinearLayout>

        <ListView
            android:id="@+id/hr_list_data"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="9.5" >
        </ListView>

    </LinearLayout>



package com.hartrate.angelcare;

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

import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;

public class heart_rate_detail_data extends Activity {

ListView listView;

private class hr_detail_list extends BaseAdapter {
private LayoutInflater layoutInflater;

String[] data = { "Android", "iPhone", "WindowsMobile", "Blackberry",
"WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" };

// Context context;
// String[] data;
private class ViewHolder {
TextView textView1, textView2;
}

public hr_detail_list(Context context) {
// TODO Auto-generated constructor stub
// this.context = context;
// this.data = data;
layoutInflater = (LayoutInflater) context
.getSystemService(LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
// TODO Auto-generated method stub
// return 0;
return data.length;
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
// return null;
return position;
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder viewHolder;
if (convertView == null) {
convertView = 
layoutInflater.inflate(R.layout.hr_detail_data_list, null);
viewHolder = new ViewHolder();
viewHolder.textView1 = (TextView) convertView.findViewById(R.id.textView1);
viewHolder.textView2 = (TextView) convertView.findViewById(R.id.textView2);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.textView1.setText("text1" + data[position]);
viewHolder.textView2.setText("text2" + data[position]);
return convertView;
}

}


@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.heart_rate_full_data);
                findViews();
     }

private void findViews(){
listView = (ListView)findViewById(R.id.hr_list_data);
listView.setAdapter(new hr_detail_list(this));
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView textView1 = (TextView)((LinearLayout)view).getChildAt(1);
Toast.makeText(getApplicationContext(), textView1.getText(), Toast.LENGTH_SHORT).show();
}
});
}



[Android] 自定義listView [方法一] 較簡單

自定義代表著有些東西要自己重新布置,當然也包含著UI,所以XML的布置

方法一

<!--hr_detail_data_list.xml-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/MyListItem"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingBottom="3dip"
    android:paddingLeft="10dip" >

            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="時間" />
    <View   
       android:layout_width="1.5dip"  
       android:layout_height="fill_parent"  
       android:background="#f9b68b"/>  
            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/HR_heart_rate_text" />
</LinearLayout>  

這是主要listView
<!-- heart_rate_full_data.xml -->
<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical" >

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>
</LinearLayout>


程式碼 
//hr_detail_list.java
package com.hartrate.angelcare;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class hr_detail_list extends BaseAdapter {
  Context context;
   String[] data;
   private static LayoutInflater inflater = null;
   
   public hr_detail_list(Context context, String[] data) {
       this.context = context;
       this.data = data;
       inflater = (LayoutInflater) context
               .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   }
   
@Override
public int getCount() {
return data.length;
}
@Override
public Object getItem(int position) {
return data[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null)
        convertView = inflater.inflate(R.layout.hr_detail_data_list, null);
        TextView text1 = (TextView) convertView.findViewById(R.id.textView2);
        
        text1.setText(data[position]);
return convertView;
}

}



package com.hartrate.angelcare;
import java.util.List;
import android.app.Activity;
import android.widget.Toast;

public class heart_rate_detail_data extends Activity {

ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.heart_rate_full_data);
// findViews();
listView = (ListView) findViewById(R.id.hr_list_data);
listView.setAdapter(new hr_detail_list(this, new String[] { "data1",
               "data2" }));
}

AdapterView.OnItemClickListener listviewOnItemClkLis = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(),
            "你選擇的是" + list[position], Toast.LENGTH_SHORT).show();
}

};




參考網址:http://stackoverflow.com/questions/15832335/android-custom-row-item-for-listview

2014年11月17日 星期一

[Android] image去背效果

原圖需要本身就有去背效果喔

android:background=@null

[Android] View 手指監聽事件





        private TextView CalendarDay;
       CalendarDay.setOnGenericMotionListener(CalendarDayTouch);

private TextView.OnGenericMotionListener CalendarDayTouch = new                
                                                  TextView.OnGenericMotionListener() {

@Override
public boolean onGenericMotion(View v, MotionEvent event) {
// TODO Auto-generated method stub

//                Toast.makeText(this, "向左滑动", Toast.LENGTH_SHORT).show();

return false;
}
};




http://www.inote.tw/android-listener-mouse-scroll-on-view

[Andorid] 日期月份轉英文簡寫月份

改天再詳解...

程式代碼
public class heart_rate_calendar extends Activity {

private TextView CalendarMonth;
private CalendarView CalendarChose;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.heart_rate_calendar);
CalendarMonth = (TextView)findViewById(R.id.calendar_month);
CalendarChose = (CalendarView)findViewById(R.id.calendarChose);

// String datetime = String.valueOf(CalendarChose.getDate());
SimpleDateFormat sdf = new SimpleDateFormat("MMM",Locale.US);
String datetime = sdf.format(CalendarChose.getDate());
CalendarMonth.setText(datetime);

}
}

2014年11月12日 星期三

[Android] 百度地圖 - 打包後無顯示

若你遇到打包後沒有顯示的問題,就代表著你在打包的時候,

你的keystore是自己指定的,所以"SHA1 fingerprit",也跟著換成不一樣的值,

所以也就變成你的地圖無法顯示的問題

小弟我目前用的方法是申請新的keystore然後給"Custom debug keystore"



再將這個新的keystore的SHA1 fingerprint申請心得Baidu map key
 






[Android] 百度地圖 - 申請Key

請進入這頁面開始申請吧
點擊"創建應用"
and_key2.png


再來依序填入吧!!~
"應用名稱"填寫 你自己認得出來的名子
"應用類別"選擇 for mobile
and_key4.png

"安全碼"填寫方式,請回到你的eclipse上尋找
and_key5.png

如果是用ADT Bundle的話請到windows -> preferance -> android -> build
將"SHA1 fingerprint"複製下來,貼上安全碼後再加上  冒號 ~>";package name"
範例: B7:A1:3B:77:F6:64:B0:08:D9:13:80:BF:0C:07:01:39:9D:40:AF:DD;com.baidu.baidulocationdemo
小弟我也有使用其他的eclipse查看,是都有這些選項,但是怕有疏忽,如果真的沒有的話再使用這個吧,不過如果都是用同一個Android SDK安裝,應該也不會有什麼機會會有錯
and_key11.png

完成創建你的Baidu Map Key
and_key13.png

參考範例
http://developer.baidu.com/map/index.php?title=androidsdk/guide/key

2014年11月11日 星期二

[Android] 百度地圖-更改中心點與Zoom

              記得加入百度地圖SDK,


            程式碼內容
                 LatLng point = new LatLng(30.245324, 130.123541);
// 在地图上添加Marker,并显示
marker = (Marker) (mBaiduMap.addOverlay(option));
// BaiduMap Location 改變地圖中心點
MapStatus mMapStatus = new MapStatus.Builder().target(point).zoom(17).build();
// 定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory
.newMapStatus(mMapStatus);
// 改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate);


參考網址
http://tieba.baidu.com/p/2263186672

[Android] 百度地圖 在地圖上畫圈圈


記得把百度的SDK放進lib裡

//畫圓圈圈
OverlayOptions polygonOption = new CircleOptions()
.center(Point).radius(Round)
.fillColor(ColorRound)
.stroke(new Stroke(5, ColorStroke));

mBaiduMap.addOverlay(polygonOption);

參考資料
http://blog.csdn.net/xiyushiyi/article/details/38360305

[Android] 百度地圖 經緯度 轉 地址

轉百度經緯度方法如下

百度地图SDK采用的是百度自有的地理坐标系(bdll09),因此开发者在做位置标注的时候,需要将其他类型的坐标转换为百度坐标。相应的接口和转换方式如下:

//將谷歌地圖,搜搜地圖,阿里雲地圖,mapabc地圖和地圖AMAP//所用坐標轉換成百度坐標
CoordinateConverter轉換器=新CoordinateConverter();
converter.from(CoordType.COMMON);
// sourceLatLng待轉換坐標
converter.coord(sourceLatLng);
經緯度desLatLng= converter.convert();

//將GPS設備採集的原始GPS坐標轉換成百度坐標
CoordinateConverter轉換器=新CoordinateConverter();
converter.from(CoordType.GPS);
// sourceLatLng待轉換坐標
converter.coord(sourceLatLng);
經緯度desLatLng= converter.convert();

參考位置:http://developer.baidu.com/map/index.php?title=androidsdk/guide/tool


如此function ,把轉換好的經緯度貼呼叫好貼上即可

private String getBaibuAddress(final double StationLatitude, final double StationLongitude) {

GeoCoder coder = GeoCoder.newInstance();

ReverseGeoCodeOption reverseCode = new ReverseGeoCodeOption();
ReverseGeoCodeOption result = reverseCode.location(new LatLng(
StationLatitude, StationLongitude));
coder.reverseGeoCode(result);
coder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {

@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
String Address = result.getAddress();
}

@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
String Address = result.getAddress();
}
});

return null;
}