Android 开发中的代码片段(1)-阿里云开发者社区

开发者社区> 禁言> 正文

Android 开发中的代码片段(1)

简介: 前言 收集Android开发中常用的一些代码片段,留存记录 代码 禁止截屏 对安全性要求比较高的APP可以用得到 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE) 禁止输入特殊字符 经历过 Tester 的无限摧残得出的结果,主要是使用正则表达式来完成校验。
+关注继续查看

前言

收集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);

最后

未完待续、敬请期待!
我的博客地址

img_1ee92a858822d3b1d90a45e40e7b1042.jpe
FullScreenDeveloper

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路
 Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路 先看一看我的代码运行结果。 代码运行起来初始化状态: 点击开始按钮,唱片机的机械臂匀速接近唱片磁盘,同时唱片磁盘也开始匀速顺时针旋转: 点击停止按钮,唱片机的机械臂匀速抬离唱片磁盘,同时唱片磁盘停止旋转: 实现思路: (一)旋转唱片磁盘。
1133 0
Android 开发中的代码片段(3)地图操作相关
前言 收集常用的代码块,留存记录。此次代码块包含:唤起高德地图导航、唤起百度地图导航 代码 判断手机内安装的地图 /**判断是否安装目标应用*/ private boolean isInstallByread(String packageName) {...
1190 0
【氚云】西部乡村教师自研低代码,开发出一个数字化校园
在四川泸州的一个乡村,有座奇特的中学,该校同时使用多达43款软件应用,打造出一座高大上的"数字校园"。
42 0
Android NFC 开发教程(2): ApiDemos->NFC->ForegoundDispatch
本例参考ApiDemos中NFC的ForegoundDispatch来介绍编写Android NFC 的基本步骤,因为手边只有MifareClassic 类型的Tag ,需要对ForegoundDispatch的代码做些修改来检测MifareClassic 的类型的NFC Tag,读写其他类型的NFC Tag的基本步骤是一致的。
558 0
使用delphi 10.2 开发linux 上的Daemon
delphi 10.2 支持linux, 而且官方只是支持命令行编程,目地就是做linux 服务器端的开发。 既然是做linux服务器端的开发,那么普通的命令行运行程序,然后等待开一个黑窗口的方式就 太low了(目前就有个别语言大咖,经常在Windows 上开个黑窗口,看起来非常恶心),那么如果 避免这个尴尬的问题?     其实Linux 下也有类似windows 服务的功能,Linux Daemon 就是其中的一种方式,命令行运行后 直接返回,同时在后台建立一个同样的进程。
1312 0
我在架构设计和代码开发中的一些常用原则
在日常的开发和设计过程中,大家对技术设计上的一些问题往往会面临很多的选择,不同的人会有不同的选择。本文介绍的就是我在工作中遇到的一些问题而总结和使用到的一些常用原则。
1164 0
【Android 应用开发】 Android 相关代码规范 更新中 ...(二)
【Android 应用开发】 Android 相关代码规范 更新中 ...(二)
7 0
Android 开发中的代码片段(2)复制对象之间的属性值
前言 开发中会遇到这样的一个情况,我们得到一个dto对象,里面有几十个属性值,需要将这几十个属性值的N个通过VO传输另外一个地方,一般我们的做法是: 创建VO类,new vo() 对象,通过vo.set(dto.get)的方式不断的设置值。
861 0
+关注
禁言
如何成为一名全屏攻城狮? 啊哈,口误,应该是如何成为一名全栈攻城狮.
50
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载