天天看點

Android 開發中的代碼片段(1)前言代碼最後

前言

收集Android開發中常用的一些代碼片段,留存記錄

代碼

禁止截屏

對安全性要求比較高的APP可以用得到

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)
           

禁止輸入特殊字元

經曆過 Tester 的無限摧殘得出的結果,主要是使用正規表達式來完成校驗。

/**
 * 禁止輸入表情以及特殊字元
 */
public static class EmojiExcludeFilter implements InputFilter {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        for (int i = start; i < end; i++) {
            int type = Character.getType(source.charAt(i));
            if (type == Character.SURROGATE || type == Character.OTHER_SYMBOL) {
                return "";
            }
        }
        String speChat = "[`~!@#$%^&*()+=|{}':;'\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘”“’?]";
        Pattern pattern = Pattern.compile(speChat);
        Matcher matcher = pattern.matcher(source.toString());
        if (matcher.find()) {
            return "";
        } else {
            return null;
        }
    }
}

調用如下:

edtRemark.setFilters(new InputFilter[]{new UIHelper.EmojiExcludeFilter()});
           

ViewPager無限滑動

用來做輪播圖(Banner)會用得到。

mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
   @Override
   public void onPageSelected(int arg0) {

   }
   @Override
   public void onPageScrolled(int arg0, float arg1, int arg2) {
       if(arg0 == 0 && (arg1 <= 0.001f && arg1 >= -0.001f)){
           mVp.setCurrentItem(list.size()-2, false);
       }else if(arg0 == list.size() - 1){
           mVp.setCurrentItem(1, false);
       }
   }
   @Override
   public void onPageScrollStateChanged(int arg0) {

   }
});
           

判斷ViewPager的滑動方向

vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            float lastPositionOffset = 0L;

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                if (lastPositionOffset > positionOffset && positionOffset != 0) {
                    //右滑
                    Log.e("direction", "right");
                } else if (lastPositionOffset < positionOffset && positionOffset != 0) {
                    //左滑
                    Log.e("direction", "left");
                }
                lastPositionOffset = positionOffset;
            }

            @Override
            public void onPageSelected(int position) { }

            @Override
            public void onPageScrollStateChanged(int state) {}
        });
           

根據百分比計算顔色值

/**
 * 根據目前的百分比 計算兩個顔色之間的值
 *
 * @param fraction 分值
 * @param startValue 開始顔色
 * @param endValue 結束顔色
 * @return 計算得出的顔色
 */
public static Integer evaluate(float fraction, Integer startValue, Integer endValue) {

    float[] startHsv = new float[3];
    float[] endHsv = new float[3];
    float[] outHsv = new float[3];

    // 把 ARGB 轉換成 HSV
    Color.colorToHSV(startValue, startHsv);
    Color.colorToHSV(endValue, endHsv);

    // 根據目前的百分比(fraction)所對應的顔色值
    if (endHsv[0] - startHsv[0] > 180) {
        endHsv[0] -= 360;
    } else if (endHsv[0] - startHsv[0] < -180) {
        endHsv[0] += 360;
    }
    outHsv[0] = startHsv[0] + (endHsv[0] - startHsv[0]) * fraction;
    if (outHsv[0] > 360) {
        outHsv[0] -= 360;
    } else if (outHsv[0] < 0) {
        outHsv[0] += 360;
    }
    outHsv[1] = startHsv[1] + (endHsv[1] - startHsv[1]) * fraction;
    outHsv[2] = startHsv[2] + (endHsv[2] - startHsv[2]) * fraction;

    // 根據目前的百分比(fraction)所對應的透明度
    int alpha = startValue >> 24 + (int) ((endValue >> 24 - startValue >> 24) * fraction);

    // 把 HSV 轉換回 ARGB 傳回
    return Color.HSVToColor(alpha, outHsv);
}
           

ViewPager之間關聯

//-----------------------------關聯 下面的内容
    int width = vpContent.getWidth();
    //滑動内部Viewpager
    vpContent.scrollTo((int) (width * position + width * positionOffset), 0);
    //-----------------------------關聯 下面的内容
           

AlertDialog狀态不變黑

主要解決使用AlertDialog狀态欄變黑的問題

public class CustomDialog extends AlertDialog {
    public CustomDialog(@NonNull Context context) {
        super(context);
    }

    public CustomDialog(@NonNull Context context, @StyleRes int theme) {
        super(context, theme);
    }

    protected CustomDialog(@NonNull Context context, boolean cancelable, OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 請使用自己的工具類擷取螢幕的高度
        int screenHeight = ScreenUtils.getScreenHeight(getContext());
        // 請使用自己的工具類擷取到狀态欄的高度
        int statusBarHeight = ScreenUtils.getStatusHeight(getContext());
        int dialogHeight = screenHeight - statusBarHeight;
        getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight);
    }
}
           

判斷螢幕旋轉方向

// 判斷Android目前的螢幕是橫屏還是豎屏。橫豎屏判斷
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
            //豎屏
        } else {
            //橫屏
        }
           

手動設定方向

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
           

最後

未完待續、敬請期待!

我的部落格位址
Android 開發中的代碼片段(1)前言代碼最後

FullScreenDeveloper

繼續閱讀