常用方法2

50)dialog樣式
51)開啟一個提示音
52)從服務器獲取json數據
53)創建txt文件,并向其寫數據
54)獲取狀態欄高度
55)獲取標題欄高度
56) 截屏代碼
57) listview的點擊變換背景色
58)自定義主題風格
59)最省代碼的按鈕監聽
60) 在service中使用Toast的方法
61)最簡單的等待窗
62) 手機拍照并保持圖片
63)獲取手機相冊中縮略圖和原始圖
64)根據路徑加載sd卡中的圖片的方法
65) 加載一張本地高清大圖的方法
66)點擊兩次返回退出
67) 自定義View 自適應寬高
68)將activity變為dialog代碼
69)自定義Dialog時,可以給dialog設置自己的風格 R.style.my_tips_dialog
70)sd卡創建文件夾和保存文件
71)自畫圓角矩形
72) 根據adapter中的數據來設置listview的高度
73) EditText 是否彈出軟鍵盤的問題
74)UI界面使用EditText時,在注冊文件中對該activity添加軟鍵盤屬性:
75) 善用Android預定義樣式
76)view的抖動效果
77)activity的切換動畫
78)listView的setOnItemClickListener方法中可以控制adapter中的組件
79)接口回調標準代碼
80)Listview 點擊item項后,讓item常亮
81)點擊組件背景白變灰色
82)自畫button,有點擊效果
83)View懸浮在所有View之上:

  1. 獲取res里圖片資源的id的方法
    85)將dp轉換為px
    86)一個TextView展示多行數據
    87)隱藏軟鍵盤
    88)ToggleButton開關按鈕的使用
    89) ObjectAnimator 創建動畫
    90)開機自啟動
    91)EditText inputType說明
    92)dip,px轉換
    93)適配
    94) 動態添加布局
    95) 獲取網絡連接模式
    96)反射方法獲取狀態欄高度
    97)每隔一秒鐘向主線程發送數據
    98)剪切(Clip)圖像資源
    99)常用的一些系統屬性
    100)如果sd卡存在就創建目錄,如果沒有就將目錄創建在緩存

51)開啟一個提示音
    private void initMusic() {

        Uri notification = RingtoneManager
                .getDefaultUri(RingtoneManager.TYPE_ALARM);
        r = RingtoneManager.getRingtone(getApplicationContext(), notification);
        if (r.isPlaying()) {
            r.stop();
        } else {
            r.play();
        }
    }

 52)從服務器獲取Json數據
        HttpPost request = new HttpPost("http://rest.careyou360.com/FamilyRest/getFamilyState");
        JSONObject param = new JSONObject();
        try {
            param.put("restVersion", 1);
            param.put("platform", "android");
            param.put("familyId", "10000");
            param.put("userId", "10000");
            StringEntity se = new StringEntity(param.toString());  //綁定到請求 Entry
            request.setEntity(se);   
            // 發送請求  
            HttpResponse httpResponse = new DefaultHttpClient().execute(request);  
            //服務器返回的數據
            String retSrc = EntityUtils.toString(httpResponse.getEntity());
        }

53)創建txt文件,并向其寫數據
    private void saveData() {
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            File sdCardDir = Environment.getExternalStorageDirectory();
            
            File saveFile = new File(sdCardDir, "微心百源Ble名單.txt");
            FileOutputStream outStream;
            if(backbleList.size()>0&&backbleList!=null){
                try {
                    outStream = new FileOutputStream(saveFile,true);
                    for (int i = 0; i < backbleList.size(); i++) {
                        outStream.write(backbleList.get(i).getName().getBytes()); 
                        outStream.write(" : ".getBytes());
                        outStream.write(backbleList.get(i).getAddress().getBytes());
                        outStream.write("\n".getBytes());
                    }
                    outStream.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } 
            }
        }else{
            Toast.makeText(this, "請插入sd卡", Toast.LENGTH_LONG).show();
        }
        
    }

  54)獲取狀態欄高度
  decorView是window中的最頂層view,可以從window中獲取到decorView,然后decorView有個getWindowVisibleDisplayFrame方法可以獲取到程序顯示的區域,包括標題欄,但不包括狀態欄。  
      Rect frame = new Rect();  
      getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  
      int statusBarHeight = frame.top; 

  55)獲取標題欄高度
     int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();  
    //statusBarHeight是上面所求的狀態欄的高度  
    int titleBarHeight = contentTop - statusBarHeight  


  56) 截屏代碼
  
   private byte[] GetandSaveCurrentImage(){
        
        View view = this.getWindow().getDecorView();  
        view.setDrawingCacheEnabled(true);  
        view.buildDrawingCache();  
        Bitmap b1 = view.getDrawingCache();  
     // 獲取狀態欄高度  
        Rect frame = new Rect();  
        this.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  
        int statusBarHeight = frame.top;  
        Log.i("TAG", "" + statusBarHeight);  
        
        int width = this.getWindowManager().getDefaultDisplay().getWidth();  
        int height = this.getWindowManager().getDefaultDisplay()  
                .getHeight();  
        Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height  
                - statusBarHeight); 
        view.destroyDrawingCache(); 
        
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        b.compress(Bitmap.CompressFormat.PNG, 100, baos);
        
        return baos.toByteArray();
        
    }

  public Bitmap ScreenShot(Activity context){
        // 獲取windows中最頂層的view
        View view=context.getWindow().getDecorView();
        view.buildDrawingCache();
        
        // 獲取狀態欄高度
        Rect rect=new Rect();
        view.getWindowVisibleDisplayFrame(rect);
        int statusBarHeights = rect.top;
        Display display = context.getWindowManager().getDefaultDisplay();
        
        // 獲取屏幕寬和高
        int widths = display.getWidth();
        int heights = display.getHeight();
        
        // 允許當前窗口保存緩存信息
        view.setDrawingCacheEnabled(true);
        
        // 去掉狀態欄
        Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0,
                statusBarHeights, widths, heights - statusBarHeights);
        
        // 銷毀緩存信息
        view.destroyDrawingCache();
        return bmp;
    }
  




  57) listview的點擊變換背景色

    android:listSelector="@drawable/record_item_selector"
  
    <selector
            xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true" android:drawable="@color/gray" />
        <item android:drawable="@color/transparent" />
    </selector>


  58)自定義主題風格
     android:theme="@style/MyAppTheme" 

     theme.xml文件
      <resources xmlns:android="http://schemas.android.com/apk/res/android">
        <style name="MyAppTheme" parent="android:Theme">
            <item name="android:windowNoTitle">true</item>   //沒有標題欄
             <item name="android:textSize">16sp</item>  //默認全局的字體大小
             <item name="android:textColor">@color/main_color</item>  //默認全局的字體顏色
             <item name="android:buttonStyle">@style/btnDefault</item>  //自定義按鈕
             <item name="android:windowBackground">@color/main_background</item>  //默認activty的背景顏色
        </style>

        <style name="btnDefault">
            <item name="android:background">@drawable/btn_default_small_normal</item>
            <item name="android:layout_width">fill_parent</item>
            <item name="android:layout_height">40dp</item>
        </style>

    </resources>
      
59)最省代碼的按鈕監聽  

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/begin_record"
        android:layout_margin="10dp"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:onClick="doClick"
        android:text="@string/begin_record" />

    <Button
        android:id="@+id/stop_record"
        android:layout_margin="10dp"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:onClick="doClick"
        android:text="@string/stop_record" />
    

</LinearLayout>

   public void doClick(View view) {     
        switch (view.getId()) {
        case R.id.begin_record:
            Toast.makeText(getApplicationContext(), "開始錄音", 1).show();
            break;
        case R.id.stop_record:
            Toast.makeText(getApplicationContext(), "停止錄音", 1).show();
            break;
        
        }
    }


60) 在service中使用Toast的方法
   private void showMessage(final String msg){      
        mHandler.post(new Runnable() {
            
            @Override
            public void run() {
                Toast.makeText(BleConnectService.this, msg, 1).show();          
            }
        });
    }

61)最簡單的等待窗
 
 mProgressDialog =ProgressDialog.show(getApplicationContext(), null, "正在加載.....");


62)手機拍照并保存圖片

    intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp1.jpg")));
    this.startActivityForResult(intent, 1);


63)獲取手機相冊中縮略圖和原始圖

 獲取縮略圖:

 public void getThumbnail(){
     cr = this.getContentResolver();
     String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,
                Thumbnails.DATA };
     Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection,
                null, null, null);

     if(cur.moveToFirst()){
            int _id;
            int image_id;
            String image_path;
            int _idColumn = cursor.getColumnIndex(Thumbnails._ID);
            int image_idColumn = cursor.getColumnIndex(Thumbnails.IMAGE_ID);
            int dataColumn = cursor.getColumnIndex(Thumbnails.DATA);
            
            do{
                _id = cursor.getInt(_idColumn);
                image_id = cursor.getInt(image_idColumn);
                image_path = cursor.getString(dataColumn);
//              Log.i("TAG", image_path);
                Thumbnail nail=new Thumbnail();
                Log.i("TAG", image_id+"");
                nail.setImage_id(image_id+"");
                nail.setImage_path(image_path);
                list.add(nail);
            }while (cur.moveToNext());      
        }
 }


  根據縮略圖id獲取原始圖:

     protected String getOriginalImagePath(String image_id) {
        String path = null;
        String[] projection = { Media._ID, Media.DATA };
        
        Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, projection,
                Media._ID + "=" + image_id, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            path = cursor.getString(cursor.getColumnIndex(Media.DATA));
        }
        return path;
    }


64)根據路徑加載sd卡中的圖片的方法
    Bitmap bm = BitmapFactory.decodeFile(filepath);
    //將圖片顯示到ImageView中
    img.setImageBitmap(bm);


65) 加載一張本地高清大圖的方法:
// url是本地大圖的sd卡位置
private Bitmap getoptBitmap(String url) {
        BitmapFactory.Options opts = new Options();
        opts.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(url,opts);
        // 從Options中獲取圖片的分辨率
        int imageHeight = opts.outHeight;
        int imageWidth = opts.outWidth;
        
        // 獲取Android屏幕的服務
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        int windowHeight = wm.getDefaultDisplay().getHeight();
        int windowWidth = wm.getDefaultDisplay().getWidth();
        
     // 計算采樣率
        int scaleX = imageWidth / windowWidth;
        int scaleY = imageHeight / windowHeight;
        int scale = 1;
        if (scaleX > scaleY && scaleY >= 1) {
            scale = scaleX;
        }
        if (scaleX < scaleY && scaleX >= 1) {
            scale = scaleY;
        }
        
        opts.inJustDecodeBounds = false;
        opts.inSampleSize = scale;
        return BitmapFactory.decodeFile(url,opts);
    }
  

  66)點擊兩次返回退出

  public boolean onKeyDown(int keyCode, android.view.KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
             exitBy2Click();
        }
        return false;
    }
    private static Boolean isExit = false;  
    private void exitBy2Click() {
        Timer tExit = null;  
        if (isExit == false) {  
            isExit = true;  
            MCToast.show("再按一次退出程序", this);     
            tExit = new Timer();  
            tExit.schedule(new TimerTask() {  
                @Override  
                public void run() {  
                    isExit = false; 
                }  
            }, 2000); 
      
        } else {  
            finish();   
        }  
    };

67) 自定義View 自適應寬高
   @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int measuredHeight = measureHeight(heightMeasureSpec);
        int measuredWidth = measureWidth(widthMeasureSpec);
        setMeasuredDimension(measuredWidth, measuredHeight);
    }

    private int measureWidth(int measureSpec) {
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        int result = XScale*data.size();
        if (specMode == MeasureSpec.AT_MOST){
            result = specSize;
        }else if(specMode == MeasureSpec.EXACTLY){
            result = specSize;
        }
        return result;
    }

    private int measureHeight(int measureSpec) {
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        int result = 500;
        if (specMode == MeasureSpec.AT_MOST){
            result = specSize;
        }else if(specMode == MeasureSpec.EXACTLY){
            result = specSize;
        }
        return result;
    }


68)將activity變為dialog代碼
    在注冊文件中寫android:theme="@style/loading_dialog"

<style name="loading_dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowBackground">@color/transparent</item>
    </style>


 69)自定義Dialog時,可以給dialog設置自己的風格 R.style.my_tips_dialog

    MyTipsDialog dialog = new MyTipsDialog(RecordActivity.this, R.style.my_tips_dialog);

    <style name="my_tips_dialog" parent="@android:Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@color/transparent</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>


70)sd卡創建文件夾和保存文件
//創建文件夾
public class DataPathUtil {
    
    public static String getDataBasePath() {
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            String parentPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/cwatch_cardio/";
            File tempFile = new File(parentPath);
            if (!tempFile.exists()) {
                tempFile.mkdirs();
            }
            return parentPath;
        }
        return null;
    }
}

recordFileName = DataPathUtil.getDataBasePath() + "BtData_"+ new Date().getTime() + ".dat";
File ecgFile = new File(recordFileName);
if(ecgFile!= null && ecgFile.exists()){
        ecgFile.delete();
}   


//創建文件
carmaCarfile = new File(DataPathUtil.getDataBasePath(), String.valueOf(System.currentTimeMillis())+ ".jpg");
    
  
 71)自畫圓角矩形

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 點擊效果 -->
    <item android:state_pressed="true">
        <shape>
            <!-- 填充 -->
            <solid android:color="@color/gray" />
            <!-- 描邊  描邊的寬度和描邊的顏色值 -->
            <stroke android:width="1dp" android:color="@color/gray" />
            <!-- 圓角 -->
            <corners android:topLeftRadius="8dp" android:topRightRadius="8dp" />
            <!-- 設置各個方向的間隔 -->
            <padding android:bottom="0dp" android:left="10dp" android:right="10dp" android:top="0dp" />
        </shape>
    </item>
    
    <!-- 默認 -->
    <item>
        <shape>
            <solid android:color="@android:color/white" />
            <corners android:topLeftRadius="8dp" android:topRightRadius="8dp" />
        </shape>
    </item>
    
</selector>


72) 根據adapter中的數據來設置listview的高度

private void setListViewHeightBasedOnChildren(ExtendedListView listView) {
        ListAdapter listAdapter = listView.getAdapter();  //得到該listview的適配器數據多少
        if(listAdapter == null){
            return;
        }
        int totalHeight=0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);     
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }

73) EditText 是否彈出軟鍵盤的問題

    1.想要一進入activity后,就彈出軟鍵盤的方法是在注冊文件activity下添加:
       android:windowSoftInputMode="stateVisible|adjustPan"

    2. 進入activity后,不彈出軟鍵盤的方法是:
        一 在注冊文件中添加:android:windowSoftInputMode="adjustUnspecified|stateHidden" 

        二 讓Edittext失去焦點: EditText edit=(EditText)findViewById(R.id.edit); 
                                edit.clearFocus(); 
    
        三 強制隱藏Android輸入法窗口
           EditText edit=(EditText)findViewById(R.id.edit); 
           InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
           imm.hideSoftInputFromWindow(edit.getWindowToken(),0);

      3. 始終不彈出軟件的方法:
            EditText edit=(EditText)findViewById(R.id.edit); 
            edit.setInputType(InputType.TYPE_NULL); 

74)UI界面使用EditText時,在注冊文件中對該activity添加軟鍵盤屬性:
        android:windowSoftInputMode="adjustResize|stateHidden"
        adjustResize: 不修改界面  stateHidden:不自動彈出


75) 善用Android預定義樣式

字體大小:
"?android:attr/textAppearanceLarge","?android:attr/textAppearanceMedium" ,"?android:attr/textAppearanceSmall"
 
 android:textAppearance="?android:attr/textAppearanceLarge" 或者
 style="?android:attr/textAppearanceLarge" 

字體顏色:
android:textColor="?android:attr/textColorPrimary" 
android:textColor="?android:attr/textColorSecondary" 
android:textColor="?android:attr/textColorTertiary" 
android:textColor="?android:attr/textColorPrimaryInverse" 
android:textColor="?android:attr/textColorSecondaryInverse"

分隔符:
 橫向:
<View android:layout_width="fill_parent" 
      android:layout_height="1dip" 
      android:background="?android:attr/listDivider" />

 縱向:
<View android:layout_width="1dip" 
      android:layout_height="fill_parent" 
      android:background="?android:attr/listDivider" />
   
 CheckBox
    style="?android:attr/starStyle"
 類似標題欄效果的TextView
    style="?android:attr/listSeparatorTextViewStyle"
 其它有用的樣式
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:paddingRight="?android:attr/scrollbarSize"
    style="?android:attr/windowTitleBackgroundStyle"
    style="?android:attr/windowTitleStyle"
    android:layout_height="?android:attr/windowTitleSize"
    android:background="?android:attr/windowBackground"

76)view的抖動效果(左右抖動)
            TranslateAnimation anim = new TranslateAnimation(imageView.getWidth(),  
            imageView.getWidth() + 10, imageView.getHeight(), imageView.getHeight());  
            anim.setInterpolator(new CycleInterpolator(6f));  //循環次數  
                                   //CycleInterpolator:動畫從開始到結束,變化率是循環給定次數的正弦曲線。  
            anim.setDuration( 500 );             //播放時間 

            magview.startAnimation(anim);



77)activity的切換動畫② 
  ① 從右到左 →
  overridePendingTransition(R.anim.in_form_left, R.anim.out_of_right);

  in_form_left:
     <?xml version="1.0" encoding="utf-8"?>  
    <set xmlns:android="http://schemas.android.com/apk/res/android"   
        android:interpolator="@android:anim/accelerate_interpolator">  
        <translate   
            android:fromXDelta="-100%p"   
            android:toXDelta="0%p"  
            android:duration="500" />  
    </set>  
   out_of_right:
     <set xmlns:android="http://schemas.android.com/apk/res/android"   
        android:interpolator="@android:anim/accelerate_interpolator">  
        <translate   
            android:fromXDelta="0%p"   
            android:toXDelta="100%p"  
            android:duration="500" />  
    </set>  ④

  ① 從左到右 ←
  getActivity().overridePendingTransition(R.anim.in_from_right, R.anim.out_of_left);

  in_from_right:
     <?xml version="1.0" encoding="utf-8"?>  
     <set xmlns:android="http://schemas.android.com/apk/res/android"   
        android:interpolator="@android:anim/accelerate_interpolator">  
        <translate   
            android:fromXDelta="100%p"   
            android:toXDelta="0%p"  
            android:duration="500" />  
    </set>  
  out_of_left:
    <?xml version="1.0" encoding="utf-8"?>  
    <set xmlns:android="http://schemas.android.com/apk/res/android"   
        android:interpolator="@android:anim/accelerate_interpolator">  
        <translate   
            android:fromXDelta="0%p"   
            android:toXDelta="-100%p"  
            android:duration="500" />  
    </set>  

    
  ③ 上下切換:
     out_to_up.xml (從屏幕上面退出)
        <?xml version="1.0" encoding="utf-8"?>
        <translate xmlns:android="http://schemas.android.com/apk/res/android"
            android:interpolator="@android:anim/accelerate_interpolator"
            android:fromYDelta="0%p"
            android:toYDelta="-100%p"
            android:duration="1000">
        </translate>
    in_from_down.xml (從屏幕下面進入)
        <?xml version="1.0" encoding="utf-8"?>
        <translate xmlns:android="http://schemas.android.com/apk/res/android"
            android:interpolator="@android:anim/accelerate_interpolator"
            android:fromYDelta="100%p"
            android:toYDelta="0%p"
            android:duration="1000">
        </translate>
  ④

78)listView的setOnItemClickListener方法中可以控制adapter中的組件
     listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                View lastCheckedOption = view.findViewById(R.id.doctor_adapter_re);
                lastCheckedOption.setBackgroundColor(color.gray_alarm);
            }
        });


79)接口回調標準代碼
 
    ① 通過方法的方式
    public interface OnListViewItemClik{
        void setItemClick(int position);
    }
    
    public void setListViewItemClik(OnListViewItemClik onclick){
        this.onclick=onclick;
    }

    ② 通過參數分方式
    private interface OnListViewItemClik{
        void setItemClick(int position);
    }

    public BleAdapter(List<BleDevice> bleList,OnBleConnectChangeListener listener ) {
        this.context=context;
        this.listener=listener;
    }   


80)Listview 點擊item項后,讓item常亮
  
   listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                if(((ListView)parent).getTag() != null){
                    ((View)((ListView)parent).getTag()).setBackgroundColor(Color.TRANSPARENT);
                }
                ((ListView)parent).setTag(view);
                view.setBackgroundColor(color.gray_alarm);
            }
        });


81)點擊組件背景白變灰色
  <selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/gray_white"></item>
    <item android:state_pressed="false" android:drawable="@color/white"></item>
</selector>

82)自畫button,有點擊效果

    <?xml version="1.0" encoding="utf-8"?>
    <selector
      xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true">
            <shape android:shape="rectangle">
                <solid android:color="#18c2ed"/>
                <stroke android:width="1dp" android:color="#18c2ed"/>
                <corners android:radius="10dp" />
                <padding android:bottom="10dp" android:left="30dp" android:right="30dp" android:top="10dp"/>       
            </shape>
        </item>     
        <item android:state_pressed="false">
            <shape android:shape="rectangle">
                <stroke android:width="1dp" android:color="#FFFFFF"/>
                <corners android:radius="10dp" />
                <padding android:bottom="10dp" android:left="30dp" android:right="30dp" android:top="10dp"/>       
            </shape>    
        </item>     
    </selector>

83)View懸浮在所有View之上:
  
        WindowManager wm = (WindowManager) getApplicationContext()
                .getSystemService(WINDOW_SERVICE);
        WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();
        wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; 
        wmParams.format = 1;
        wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE;;
        wmParams.width = 200;
        wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;;
        wm.addView(new Button(getApplicationContext()), wmParams); // 創建View


        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>  


84) 獲取res里圖片資源的id的方法:
         level++;
         int resId=context.getResources().getIdentifier("v"+level, "drawable", context.getPackageName());
         mVoice.setImageResource(resId);


85)將dp轉換為px
  mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50,
                              context.getResources().getDisplayMetrics());
  
86)一個TextView展示多行數據
    String str=new StringBuilder()
        .append("\n")
        .append("說明:").append("\n")
        .append("1.懸浮窗可隨意移動").append("\n")
        .append("2.實時顯示當前內存數據").append("\n")     
        .append("3.上層數據表示可用內存值").append("\n")
        .append("4.下層數據表示總內存值").append("\n")
        .append("5.點擊懸浮窗出現關閉小圖標可直接關閉").append("\n").append("\n").toString();
        tv.setText(str);     
        
87)隱藏軟鍵盤
  private void hideKeyboard() {
        if(imm==null){
            imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
        }
        if(imm.isActive()){
            imm.hideSoftInputFromWindow(heightEditText.getWindowToken() , 0); 
        }
    }
   
   有EditText的activity都要加這句話
   android:windowSoftInputMode="adjustUnspecified|stateHidden"

88)ToggleButton開關按鈕的使用

        <style name="setting_toggle_button" parent="android:style/Theme">
                 <item name="android:layout_width">60dp</item>
                <item name="android:layout_height">32dp</item>
                <item name="android:layout_centerVertical">true</item>
                <item name="android:layout_alignParentRight">true</item>
                <item name="android:textOn">""</item>
                <item name="android:textOff">""</item>
                <item name="android:background">@drawable/setting_toggle_bg_sel</item>
                <item name="android:clickable">false</item>
         </style>

        setting_toggle_bg_sel.xml:
         <?xml version="1.0" encoding="utf-8"?>
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:drawable="@drawable/setting_item_unselected" android:state_checked="false"/>
            <item android:drawable="@drawable/setting_item_selected" android:state_checked="true"/>
        </selector>

        fitlerBWToggle.setChecked(value);

89) ObjectAnimator 創建動畫

        /*
     * 執行一個動畫
     */
    public void animClick(View v){  
        ObjectAnimator objAnimator=ObjectAnimator.ofFloat(imageView, "translationX", 0,100);
        objAnimator.setDuration(2000);
        objAnimator.setRepeatCount(10);
        objAnimator.setInterpolator(new LinearInterpolator());
        objAnimator.start();
    }
    
    /**
     * 兩個動畫同時執行
     */
    public void animClick(View v){  
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(imageView, "scaleX",  
                1.0f, 2f);  
        ObjectAnimator anim2=ObjectAnimator.ofFloat(imageView, "alpha", 1f,0f);
        AnimatorSet animSet = new AnimatorSet();  
        animSet.setDuration(2000);  
        animSet.setInterpolator(new LinearInterpolator());  
        //兩個動畫同時執行  
        animSet.playTogether(anim1, anim2);  
        animSet.start();  
    }
    
    /** 
     * anim1,anim2,anim3同時執行 
     * anim4接著執行 
     */  
    public void animClick(View v){  
        float cx = imageView.getX();  
          
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(imageView, "scaleX",1.0f, 2f);  
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(imageView, "scaleY",1.0f, 2f);  
        ObjectAnimator anim3 = ObjectAnimator.ofFloat(imageView, "x",  cx ,  0f);  
        ObjectAnimator anim4 = ObjectAnimator.ofFloat(imageView,"translationX", 0,360f);  
        AnimatorSet animSet = new AnimatorSet();  
        animSet.play(anim1).with(anim2);  
        animSet.play(anim2).with(anim3);  
        animSet.play(anim4).after(anim3);  
        animSet.setDuration(1000);  
        animSet.start();  
    }


90)開機自啟動

  開機后系統會發送一個啟動完畢的廣播,Intent.ACTION_BOOT_COMPLETED,
  那么我們只需要自定義一個BroadcastReciever接收這個廣播,在接收到廣播后啟動我們的程序就可以實現開機啟動了。

  public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
            // 是否選擇了開機啟動
            boolean start = PreferenceManager.getDefaultSharedPreferences(
                    context).getBoolean(
                    CleanerActivity.KEY_START_WHEN_BOOT_COMPLETED, true);
            if (start) {
                Intent i = new Intent();
                i.setClass(context, FloatService.class);
                context.startService(i);
            }
        }
    }
}

    AndroidManifest.xml中的聲明如下:
     <receiver android:name="MyBroadcastReceiver" >
                <intent-filter>
                    <action  android:name="android.intent.action.BOOT_COMPLETED" />
                </intent-filter>
    </receiver>


91)EditText inputType說明

    android:inputType="textCapWords"http://單詞首字母大小
    android:inputType="textCapSentences"http://僅第一個字母大小
    android:inputType="textAutoCorrect"android:inputType="textAutoComplete"http://前兩個自動完成
    android:inputType="textMultiLine"http://多行輸入
    android:inputType="textImeMultiLine"http://輸入法多行(不一定支持)
    android:inputType="textNoSuggestions"http://不提示
    android:inputType="textUri"http://URI格式
    android:inputType="textEmailAddress"http://電子郵件地址格式
    android:inputType="textEmailSubject"http://郵件主題格式
    android:inputType="textShortMessage"http://短消息格式
    android:inputType="textLongMessage"android:inputType="textPersonName"http://人名格式
    android:inputType="textPostalAddress"http://郵政格式
    android:inputType="textPassword"http://密碼格式
    android:inputType="textVisiblePassword"http://密碼可見格式
    android:inputType="textWebEditText"http://作為網頁表單的文本格式
    android:inputType="textFilter"http://文本篩選格式
    android:inputType="textPhonetic"http://拼音輸入格式
    android:inputType="number"http://數字格式
    android:inputType="numberSigned"http://有符號數字格式
    android:inputType="numberDecimal"http://可以帶小數點的浮點格式
    android:inputType="phone"http://撥號鍵盤
    android:inputType="datetime"android:inputType="date"http://日期鍵盤
    android:inputType="time"http://時間鍵盤

92)dip,px轉換
     public static int dip2px(Context context, float dipValue){ 
        final float scale = context.getResources().getDisplayMetrics().density; 
        return (int)(dipValue * scale + 0.5f); 
    } 
    public static int px2dip(Context context, float pxValue){ 
        final float scale = context.getResource().getDisplayMetrics().density; 
        return (int)(pxValue / scale + 0.5f); 
    } 
 
93)適配
       public static int getPhoneDpi(Context context){
            
            WindowManager wm = (WindowManager) context
                    .getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics dm = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(dm);
            int densityDPI = dm.densityDpi;
            return densityDPI; 
            
        }
        int dip = DensityUtil.getPhoneDpi(context);
        if (dip >= 480) {  //dip是每英寸像素點(分為120低,160中,240高,320超高,480蘋果分辨率)
            canvas.drawText(infoRect.top + 100, textPaint);
            
        } else {
            canvas.drawText(infoRect.top + 60, textPaint);
            
        }

94) 動態添加布局

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <FrameLayout
            android:id="@+id/frameLayout"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
        </FrameLayout>

    </LinearLayout>

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        FrameLayout fl=(FrameLayout)findViewById(R.id.frameLayout);  
        fl.addView(new MyView(this)); 
    
    }


95) 獲取網絡連接模式

        public class NetUtil {
        public static final int NETWORN_NONE = 0;
        public static final int NETWORN_WIFI = 1;
        public static final int NETWORN_MOBILE = 2;

        public static int getNetworkState(Context context) {
            ConnectivityManager connManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);

            // Wifi
            State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                    .getState();
            if (state == State.CONNECTED || state == State.CONNECTING) {
                return NETWORN_WIFI;
            }

            // 3G
            state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
                    .getState();
            if (state == State.CONNECTED || state == State.CONNECTING) {
                return NETWORN_MOBILE;
            }
            return NETWORN_NONE;
        }
    }

96)反射方法獲取狀態欄高度
      public static int getStatusBarHeight(Context context) {
        int statusBarHeight = 20;
        try {
            Class<?> _class = Class.forName("com.android.internal.R$dimen");
            Object object = _class.newInstance();
            Field field = _class.getField("status_bar_height");
            int restult = Integer.parseInt(field.get(object).toString());
            statusBarHeight = context.getResources().getDimensionPixelSize(
                    restult);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // Toast.makeText(getActivity(), "StatusBarHeight = " + statusBarHeight,
        // Toast.LENGTH_SHORT).show();
        return statusBarHeight;
    }

97)每隔一秒鐘向主線程發送數據
     mTimer = new Timer();
     mTimer.schedule(new TimerTask() {  
            @Override  
            public void run() {  
                Message message = new Message();  
                message.what = 1;  
                handler.sendMessage(message);  
            }  
        }, 1000, 1000);  /* 表示1000毫秒之後,每隔1000毫秒執行一次 */
  
    private Handler handler = new Handler() {  
        private int progress=0;

        @Override  
        public void handleMessage(Message msg) {  
            super.handleMessage(msg);  
            int msgId = msg.what;  
            switch (msgId) {  
                case 1:  
                    progress++;
                    if(progress==10){
                        mTimer.cancel();
                    }
                    break;   
            }  
        }  
    };  


98)剪切(Clip)圖像資源
  剪切圖像資源可以只顯示一部分圖像,這種資源經常被用在進度條的制作上。剪切圖像資源是一個XML格式文件,資源只包含一個<clip>標簽
    res/drawable/clip.xml
    <?xml version="1.0" encoding="utf-8"?> 
    <clip xmlns:android="http://schemas.android.com/apk/res/android" 
        android:drawable="@drawable/progress" android:clipOrientation="horizontal" 
        android:gravity="left" />

    <ImageView 
        android:id="@+id/image" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:background="@drawable/clip"/> 

    ImageView imageview = (ImageView) findViewById(R.id.image);  
    ClipDrawable drawable = (ClipDrawable) imageview.getBackground();  
    drawable.setLevel(3000)   level的范圍為[0,10000]
  


99)常用的一些系統屬性
    字體大小:
        style="?android:attr/textAppearanceLarge"
        style="?android:attr/textAppearanceMedium"
        style="?android:attr/textAppearanceSmall"
    字體顏色:
        android:textColor="?android:attr/textColorPrimary"
        android:textColor="?android:attr/textColorSecondary"
        android:textColor="?android:attr/textColorTertiary"
        android:textColor="?android:attr/textColorPrimaryInverse"
        android:textColor="?android:attr/textColorSecondaryInverse"
    分隔符 橫向:
        <View
            android:layout_width="fill_parent"
            android:layout_height="1dip"
            android:background="?android:attr/listDivider" />
   
100)如果sd卡存在就創建目錄,如果沒有就將目錄創建在緩存 

     public static String getCurrentDataPath(Context context, String folderName) throws IOException {
            String currentDataPath = "";
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                currentDataPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + folderName;
                File dir = new File(currentDataPath);
                if (!dir.exists())
                    dir.mkdir();
            } else {
                currentDataPath = context.getFilesDir().getAbsolutePath();
            }
            return currentDataPath;
        }


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,702評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,489評論 0 17
  • 曾經我在發呆的時候,突然有個想法,世界上那么多人,如果每個人給我一塊錢,就一塊錢,那豈不是我就是億萬富翁了?哈哈哈...
    DigitalCat閱讀 8,448評論 0 10
  • 當今時代,越來越多的人覺得自己的錢不夠用,越來越覺得存在銀行是最無效的投資方式。因而越來越多的人就選擇了其他的投資...
    人與海閱讀 190評論 0 1
  • 我叫池芮伊,16歲,身高162cm,體重40kg。擁有著動漫里一般過腰的長發,然而稀少……擁有一雙靈動的雙眼,然而...
    GaLyeo咖喱閱讀 769評論 4 2