2013年10月6日 星期日

[Android] dp px 互換(dp px exchange)

Image from BBC GEL



單位

dp : Density-independent pixel,獨立於螢幕解析度密度的像素值,也就是說,當你設定 1dp 時,在 120 dpi 的螢幕上會是原本的 75 %,在 160 dpi 的螢幕上為 100%,在 240 dpi 的螢幕上為 150%,實際的像素值會依螢幕密度而改變。

px : pixel ,一般所認知的像素值,指定多少就是多少,不會因螢幕密度不同而改變。所以 100 * 100 px 的方形在 320 x 480 螢幕的手機上看起來會比 1280 x 720 的螢幕上看起來大很多,這個方形實際上尺寸並沒有改變,改變的是螢幕解析度,放在一個較小的空間看起來比較大,放在一個較大的空間,看起來就會比較小。

這裡有圖示解說,看圖比較容易懂。


轉換

如果單純只在 layout 上指定值,直接指定 dp 就好了,但如果要在程式碼中指定就必須要做轉換,否則都是 px ,我們必須把它轉為 dp 才能和其他在 layout 中指定的元件有一樣的比例。

我自己是找到公式後寫成工具程式,直接叫用就好了,程式碼如下:

/**
 * Covert dp to px
 * @param dp
 * @param context
 * @return pixel
 */
public static float convertDpToPixel(float dp, Context context){
    float px = dp * getDensity(context);
    return px;
}

/**
 * Covert px to dp
 * @param px
 * @param context
 * @return dp
 */
public static float convertPixelToDp(float px, Context context){
    float dp = px / getDensity(context);
    return dp;
}

/**
 * 取得螢幕密度
 * 120dpi = 0.75
 * 160dpi = 1 (default)
 * 240dpi = 1.5
 * @param context
 * @return
 */
public static float getDensity(Context context){
 DisplayMetrics metrics = context.getResources().getDisplayMetrics();
 return metrics.density;
}


參考資料

http://developer.android.com/guide/practices/screens_support.html
http://www.bbc.co.uk/gel/tablet/tablet-device-considerations/pixel-density

php 取得遠端網站的內容

取得遠端的網頁內容的函式名稱:

file_get_contents



用法:

$homepage=file_get_contents('http://www.kimo.com.tw');

echo $homepage

以PHP讀寫Excel檔案

以PHP讀寫Excel檔案



http://phpexcel.codeplex.com/

用google找了一下,PHPExcel類別的功能非常強大,支援各版本的Excel檔案、CSV、HTML及PDF檔案的讀寫,有這方面的需求,改用這套工具可以省卻不少自行撰寫工具的時間,對使用者來說,Excel檔案的親和性比起CSV檔案來說,好太多了,所以決定使用Excel作為報表讀取檔案。



文章起頭的網址是PHPExcel的官網,從官網下載套件後,下載套件內的說明文件非常詳盡,花一二天就可以讀懂,使用上並不困難,只是要花時間熟悉使用方法。



PHPExcel的安裝

解壓縮下載的套件後,將Class目錄放到類別目錄下。



PHPExcel的使用

require Class/PHPExcel.php後,PHPExcel會自動載入需要的所有類別,不需作後續設定。



PHPExcel的設計哲學

物件分成三大區塊

1)Excel檔的操控--針對Excel2007版本的Excel進行操控,所有操控都在記憶體中進行,檔案的寫入及讀取由其他物件負責。

2)Excel檔的讀取--包含各版本Excel、PDF、CSV等

3)Excel檔的寫入--包含各版本Excel、PDF、CSV等



讀取Excel檔案的操件方法

1)由PHPExcel決定載入檔案的種類,如Excel版本,而不硬性設定。



1.$reader = PHPExcel_IOFactory::load('excel檔');





2)由PHPExcel決定載入檔案的種類,不硬性設定讀取的檔案種類,但將檔案設定為唯讀屬性。



1.$reader= PHPExcel_IOFactory::createReaderForFile('excel檔');
2.$reader->setReadDataOnly(true);
3.$excel= $reader->load('excel檔');





讀取某一格的Excel內容

column由0開始

row由1開始



1.$sheet=$excel->getActiveSheet();
2.$sheet->getCell('A8')
3.->getValue();







1.$sheet=$excel->getActiveSheet();
2.$sheet->getCellByColumnAndRow(2,8)
3.getValue();





取得公式計算後的結果



1.$sheet=$excel->getActiveSheet();
2.$sheet->getCell('A8')
3.->getCalculatedValue();
 




循序讀取cell的內容



01.<?php
02.$objReader = PHPExcel_IOFactory::createReader('Excel2007');
03.$objReader->setReadDataOnly(true);
04.$objPHPExcel = $objReader->load("test.xlsx");
05.$objWorksheet = $objPHPExcel->getActiveSheet();
06.echo '<table>' . "\n";
07.foreach ($objWorksheet->getRowIterator() as $row) {
08. echo '<tr>' . "\n";
09.$cellIterator = $row->getCellIterator();
10. $cellIterator->setIterateOnlyExistingCells(false); // This loops all cells,
11. // even if it is not set.
12. // By default, only cells
13. // that are set will be
14. // iterated.
15. foreach ($cellIterator as $cell) {
16. echo '<td>' . $cell->getValue() . '</td>' . "\n";
17. }
18.echo '</tr>' . "\n";
19.}
20.echo '</table>' . "\n";
21.?>







01.<?php
02.$objReader = PHPExcel_IOFactory::createReader('Excel2007');
03.$objReader->setReadDataOnly(true);
04.$objPHPExcel = $objReader->load("test.xlsx");
05.$objWorksheet = $objPHPExcel->getActiveSheet();
06.$highestRow = $objWorksheet->getHighestRow(); // e.g. 10
07.$highestColumn = $objWorksheet->getHighestColumn(); // e.g 'F'
08.$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); // e.g. 5
09.echo '<table>' . "\n";
10.for ($row = 1; $row <= $highestRow; ++$row) {
11. echo '<tr>' . "\n";
12.for ($col = 0; $col <= $highestColumnIndex; ++$col) {
13. echo '<td>' . $objWorksheet->getCellByColumnAndRow($col, $row)->getValue() . '</td>' . "\n";
14. }
15.echo '</tr>' . "\n";
16.}
17.echo '</table>' . "\n";
18.?>





設定使用第幾個活頁簿(index從0開始)



1.setActiveSheetIndex(0);





使用流程
1)讀取Excel檔案或創建Excel檔案
2)解析並操控Excel檔案
3)將記憶體中的Excel轉換成其他的型態