2016年7月27日 星期三

Android 畫面設定

// 關閉APP標題bar
this.requestWindowFeature(Window.FEATURE_NO_TITLE);

// 關閉最上面的狀態bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

//直行
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//AndroidManifest.xml


//橫行
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
//AndroidManifest.xml

 

但切記,要再setContentView前就讀取此程式碼

2016年7月24日 星期日

C# 偵測是否為手機瀏覽

出處

Javascript刷新頁面

出處


Javascript刷新頁面的幾種方法:
1   history.go(0)
2   location.reload()
3   location=location
4   location.assign(location)
5   document.execCommand('Refresh')
6   window.navigate(location)
7   location.replace(location)
8   document.URL=location.href


自動刷新頁面的方法:1.頁面自動刷新:把如下代碼加入<head>區域中
<meta http-equiv="refresh" content="20">
其中20指每隔20秒刷新一次頁面.
2.頁面自動跳轉:把如下代碼加入<head>區域中
<meta http-equiv="refresh" content="20;url=http://www.wyxg.com">
其中20指隔20秒後跳轉到http://www.wyxg.com頁面
3.頁面自動刷新js版
<script language="JavaScript">
 function myrefresh()
 {
      window.location.reload();
 }
 setTimeout('myrefresh()',1000); //指定1秒刷新一次
</script>
ASP.NET如何輸出刷新父窗口腳本語句1.  this.response.write("<script>opener.location.reload();</script>");

2.  this.response.write("<script>opener.window.location.href = opener.window.location.href;</script>");  
3.  Response.Write("<script language=javascript>opener.window.navigate(''你要刷新的頁.asp'');</script>")

JS刷新框架的腳本語句

//如何刷新包含該框架的頁面用  
<script language=JavaScript>
  parent.location.reload();
</script>   

//子窗口刷新父窗口
<script language=JavaScript>
   self.opener.location.reload();
</script>
( 或 <a href="javascript:opener.location.reload()">刷新</a>   )

//如何刷新另一個框架的頁面用  
<script language=JavaScript>
  parent.另一FrameID.location.reload();
</script>

如果想關閉窗口時刷新或者想開窗時刷新的話,在<body>中調用以下語句即可。

<body onload="opener.location.reload()"> 
開窗時刷新
<body onUnload="opener.location.reload()"> 
關閉時刷新

<script language="javascript">
window.opener.document.location.reload()
</script>

C# 影像縮圖


/// <summary>自動縮圖</summary>
/// <param name="img">檔案本體</param>
/// <param name="filePath">存放位置</param>
/// <param name="fileName">檔案名稱</param>
protected void reDrawingImg(byte[] imgBuffer, string filePath, string fileName) {
System.Drawing.Image img = bufferToImage(imgBuffer);
ImageFormat thisFormat = img.RawFormat;   //取得影像的格式

int[] newWH = imgReSize(img.Width, img.Height);

Bitmap imageOutput = new Bitmap(img, newWH[0], newWH[1]);

        //縮圖後存放指定位址
imageOutput.Save(filePath + fileName, thisFormat);

imageOutput.Dispose();   //釋放記憶體
img.Dispose();               //釋放掉圖檔
}

/// <summary>將 byte[] 轉成 Image</summary>
/// <param name="Buffer">檔案本體 (byte[])</param>
private System.Drawing.Image bufferToImage(byte[] Buffer) {
byte[] data = null;
System.Drawing.Image oImage = null;
MemoryStream oMemoryStream = null;
Bitmap oBitmap = null;
//建立副本
data = (byte[])Buffer.Clone();
try {
oMemoryStream = new MemoryStream(data);
//設定資料流位置
oMemoryStream.Position = 0;
oImage = System.Drawing.Image.FromStream(oMemoryStream);
//建立副本
oBitmap = new Bitmap(oImage);                
catch {
throw;
}
finally {
oMemoryStream.Close();
oMemoryStream.Dispose();
oMemoryStream = null;
}
return oBitmap;
}


/// <summary>等比縮圖 - 計算長寬</summary>
/// <param name="width">原始寬度</param>
/// <param name="height">原始高度</param>
protected int[] imgReSize(double width, double height) {
int[] newWH = new int[2];
double rate, rWidth, rHeight;

if (width > height && width > 200) {
//水平圖
rWidth = 200;
rate = rWidth / width;
rHeight = height * rate;
newWH[0] = (int)rWidth;
newWH[1] = (int)rHeight;
}
else if (height > width && height > 150) {
//垂直圖
rHeight = 150;
rate = rHeight / height;
rWidth = width * rate;
newWH[0] = (int)rWidth;
newWH[1] = (int)rHeight;
}
else {
newWH[0] = (int)width;
newWH[1] = (int)height;
}
return newWH;
}


2016年7月21日 星期四

C# 網頁轉PDF

出處

[C#] 網頁Html轉PDF檔(一行程式碼解決)

[C#] 網頁Html轉PDF檔(一行程式碼解決)
網頁轉PDF檔做法很多(Convert HTML to PDF in .NET)
這邊紀錄一下老外最多人加分的那篇做法,使用wkhtmtopdf(採GPL授權)可以省很多程式碼

找installer.exe下載,這邊Demo我是下載wkhtmltopdf-0.9.9-installer.exe
下載完後執行安裝它
image
image
選擇要安裝的路徑
image
安裝完成
image
(如果要解除安裝的話,就到剛剛安裝的資料夾下找uninstall.exe執行即可)

接著看它的原始使用方式
在安裝路徑下有個wkhtmltopdf.exe檔
到命令提示字元(開始→執行→cmd)
輸入
image
這邊就抓中國MSDN論壇網頁轉PDF為例
按下Enter轉換完成
image

打開剛剛轉換完成的PDF檔
image
該文字的地方就是文字,該圖片的地方就是圖片,該超連結的地方就是超連結

既然知道底層使用方式,那就可以使用
第一個參數傳執行檔路徑,第二個傳參數(URL和PDF檔的存放路徑)
如下:

    protected void Button1_Click(object sender, EventArgs e)
    {
                                                                                                   //因為是兩個argument,所以記得要空格
        System.Diagnostics.Process.Start(@"D:\wkhtmltopdf\wkhtmltopdf.exe", @"http://msdn.microsoft.com/zh-cn D:\myFileName.pdf");
        
    }

此小工具不會像WinForm的WebBrowser控制項一樣會共用IE瀏覽器的Cookie
而且要抓的網頁來源不一定要URL,也可以像這樣直接抓本機上的Html檔轉PDF

    protected void Button1_Click(object sender, EventArgs e)
    {
        System.Diagnostics.Process.Start(@"D:\wkhtmltopdf\wkhtmltopdf.exe", @"D:\index.html D:\myFileName.pdf");
    }
只是抓本機的Html轉成PDF後,圖片會不見這點要注意

2016年7月17日 星期日

C# FileUpload預覽圖片

FileUpload上傳圖片前預遊覽圖片,使用javascript,相容多數遊覽器

FileUpload 上傳圖片前預遊覽圖片,使用 javascript,相容多數遊覽器

1030320測試IE8、Chrome可用

=============圖   示===================================




















==============說       明=================================

Chrome、Firefox、IE10 使用FileReader秀圖。
IE6~9 要用濾鏡 filter:progid:DXImageTransform.Microsoft.AlphaImageLoader 來秀圖

==============下面是code===============================

<head>

<style type="text/css">
#picview, .img, img
{
 width:200px;
 height:200px;
 }
 #picview
 {
border:1px solid #000;
 }
 </style>

 <script type="text/javascript">
 function picview(file)
 {
 var picviewDiv = document.getElementById('picview');
 if (file.files && file.files[0])
 {
 var reader = new FileReader();
 reader.onload = function(evt){
 picviewDiv.innerHTML = '<img src="' + evt.target.result + '" />';
 }
 reader.readAsDataURL(file.files[0]);
 }
 else
 {
 picviewDiv.innerHTML = '<div class="img" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src=\'' + file.value + '\'"></div>';
 }
 }
</script>

 </head>


 <body>
 <div id="picview"></div>
<asp:FileUpload ID="FileUpload1" runat="server" onchange="picview(this)" />


</body>

 </html>出處

2016年7月10日 星期日

Android 6.0 權限處理

出處

Android 6.0 运行时权限处理

运行时权限介绍

Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,
又新增了运行时权限动态检测,以下权限都需要在运行时判断:
身体传感器
日历
摄像头
通讯录
地理位置
麦克风
电话
短信
存储空间

运行时权限处理

Android6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,
所以如果你以前的APP设置的targetSdkVersion低于23,在运行时也不会崩溃,
但这也只是一个临时的救急策略,用户还是可以在设置中取消授予的权限。
  • 声明目标SDK版本
    我们需要在build.gradle中声明targetSdkVersion为23
    android {
     compileSdkVersion 23
     buildToolsVersion "23.0.1"
    
     defaultConfig {
         applicationId "com.yourcomany.app
         minSdkVersion 18
         targetSdkVersion 23
         versionCode 1
         versionName "1.0"
     }
     buildTypes {
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }
    }
  • 检查并申请权限
    我们需要在用到权限的地方,每次都检查是否APP已经拥有权限,
    比如我们有一个下载功能,需要写SD卡的权限,
    我们在写入之前检查是否有WRITE_EXTERNAL_STORAGE权限,没有则申请权限
          if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                  != PackageManager.PERMISSION_GRANTED) {
              //申请WRITE_EXTERNAL_STORAGE权限
              ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                      WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
          }
  • 请求权限后,系统会弹出请求权限的Dialog
  • 用户选择允许或拒绝后,会回调onRequestPermissionsResult方法, 该方法类似于onActivityResult
      @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
          super.onRequestPermissionsResult(requestCode, permissions, grantResults);
          doNext(requestCode,grantResults);
      }
  • 我们接着需要根据requestCode和grantResults(授权结果)做相应的后续处理
    private void doNext(int requestCode, int[] grantResults) {
          if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
              if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                  // Permission Granted
              } else {
                  // Permission Denied
              }
          }
      }

Fragment中运行时权限的特殊处理

  • 在Fragment中申请权限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否则会回调到Activity的onRequestPermissionsResult
  • 如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方法,onRequestPermissionsResult不会回调回来,建议使用getParentFragment().requestPermissions方法,
    这个方法会回调到父Fragment中的onRequestPermissionsResult,加入以下代码可以把回调透传到子Fragment
      @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
          super.onRequestPermissionsResult(requestCode, permissions, grantResults);
          List<Fragment> fragments = getChildFragmentManager().getFragments();
          if (fragments != null) {
              for (Fragment fragment : fragments) {
                  if (fragment != null) {
                      fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);
                  }
              }
          }
      }

相关开源项目

PermissionsDispatcher
使用标注的方式,动态生成类处理运行时权限,目前还不支持嵌套Fragment。
RxPermissions
基于RxJava的运行时权限检测框架
Grant
简化运行时权限的处理,比较灵活
android-RuntimePermissions
Google官方的例子

附录

以下权限只需要在AndroidManifest.xml中声明即可使用
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT

2016年7月5日 星期二

Android下 spinner 更換字體大小、顏色

出處


Android下拉選單(spinner)應用(五) - 更換字體大小、顏色



一般網路上都會教一些基本下拉選單(spinner),套用simple_spinner_dropdown_item或

simple_spinner_item這些基本模板,但有時想改變Spinner內的文字大小及顏色又不知從哪下手

今天就來教大家怎麼改變Spinner內的文字大小及顏色,當然也包含對齊方式

我用比較簡單的方法直接由Layout下手去修改Spinner內文字的字體大小及顏色

步驟一:

在res-->layout內新增一個myspinner.xml的android xml檔,貼上下列程式碼

myspinner.xml
?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:gravity="center"
    android:paddingLeft="8dip"
    android:singleLine="true"
    android:textColor="#8B008B"
    android:textSize="32sp"
    android:textStyle="bold" >
</TextView>


步驟二:

回到java程式碼,假設我們已經在main.xml中加入一個下拉選單spinner1了

基本的下拉選單都是這樣寫的:
?
1
2
3
4
5
6
7
8
//將可選内容與ArrayAdapter連接起來
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,Blood_group);
//對應控件
spinner = (Spinner) findViewById(R.id.spinner1);
//設置下拉列表的風格
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//將adapter 添加到spinner中 
spinner.setAdapter(adapter);

換成下面這個樣子:
?
1
2
3
4
5
6
7
8
//將可選内容與ArrayAdapter連接起來
adapter = new ArrayAdapter<String>(this,R.layout.myspinner,Blood_group);
//對應控件
spinner = (Spinner) findViewById(R.id.spinner1);
//設置下拉列表的風格
adapter.setDropDownViewResource(R.layout.myspinner);
//將adapter 添加到spinner中 
spinner.setAdapter(adapter);


為什麼有兩個地方是要換成myspinner的呢?

因為adapter是代表內容(也就是下拉時)

setDropDownViewResource是代表靜止未點選下拉時的樣式(感謝網友指教)

setDropDownViewResource是代表點選下拉時彈出的樣式

執行後畫面



文字被我改為紫色、字體大小變32、置中對齊

這樣簡簡單單兩個步驟就能改變下拉選單的三種樣式設定了

以上介紹,謝謝各位!!

ps:貼上一些參數(spinner、adapter、Blood_group)的宣告,不然新手會對應不起來
?
1
2
3
private Spinner spinner; 
 private ArrayAdapter<String> adapter; 
 private static final String[] Blood_group={"A型","B型","O型","AB型","其他"};