前言
收集 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);
- # 最后
来源: http://www.tuicool.com/articles/yEVR3ea