android适配 ios
2017-08-30 17:21:00 weixin_33786077 阅读数 26

前段项目有个需求,要求在原来xxx功能的基础上加个表情,当时第一念头,这简单,写个配置文件,一个表情对应一个字符串,例如:[微笑]--》微笑的表情。于是便开始手撸了个表情框架,写完之后终于松了口气,提交给老板,第二天老板直接拿着这个表情给我:ios为什么显示不了?复制到别 的地方怎么是字符串?针对这2个问题,我苦思冥想。和IOS之间协议商定一个规则?可是复制到别的地方怎么办?还是字符串?

最后终于找到了解决办法,输入法自带的表情是通用的,可以支持所有app的显示问题,很简单:
将表情转成UTF-8格式,每个表情占4个字节,传给后台:

URLEncoder.encode(content, "UTF-8");

拿到该字符串之后,解析出来:

String decode = URLDecoder.decode(TextUtils.fromHtml(content, "UTF-8");
textview.settext(decode);

即可正常显示表情,而且你把该表情复制到微信啊,qq啊等等都是可以显示的。

public static Spanned fromHtml(String str) {
    if (str!=null) {
        return Html.fromHtml(str);
    } else {
        return null;
    }
}
2013-04-02 13:50:48 qingye_love 阅读数 1418

前言:

以前做feature phone的朋友,特别是MMI的,对各公司出的分辨率适配,估计都叫烦,以为做智能机开发了,算好点了,可是,现在又涉及到各分辨率(主流)的适配了。

目前,Android主流分辨率有:

        1. Density 为 1.5的有:480x800, 480x854, 540x960;

        2. Density 为 2.0的有:1280x720, 1280x800;

特别的:对于Android OS 4.0以上的来说,有些设备厂商,为了节省硬件成本,使用了系统自带的虚拟键盘,而去掉了物理键盘(返回键,Home键,菜单键),而虚拟键盘,会占用一定的高度,这对于Android App开发来说,都需要在应用第一个界面开始时,做一些工作,来确保显示给用户时,能够正常显示,而不会出现控件,界面偏差,或者图片的失帧。

而iOS设备,目前主流的是:

        iPhone4/4S, iTouch4, iPhone5, iTouch5;

其中,4,4S的分辨率,都是640x960,而到了5的分辨率,就变成了1136x640,同样,存在着分辨率适配的问题。

 

适配:

1. iOS

        苹果的分辨率较少,就两种,适配起来,也比较简单,咱们只需要在需要动态调整坐标,大小的控件所在处之前,判断一下当前的self.view的高度就行:

        if(self.view.frame.size.height == 460){

            // iPhone4/4S, iTouch4

        } else {

            // iPhone5, iTouch5

        }

       为什么判断高度为460,而不是480?

       这里有两点需要说明的,对于刚开始学习iOS开发的朋友,肯定对这里会有疑惑:

      1.因为在模拟器上,它是320x480,是以像素点来计算,而到了设备640x960上,变成了视网膜屏,是4个像素点等于模拟器上1个像素点,所以,咱们只需要按照实际的像素点来计算就行;

      2.默认情况下,在640x960的设备上,系统状态栏是需要占用20个像素点,所以,self.view的高度就是460。

 

2. Android

        Android的分辨率太多了,不过,值得庆幸一点的是,现在,使用320x480,密度值为1.0的手机,几乎没有了,有也不是主流,所以,大多数产品,或公司策略在开始时,就不会要求去适配这块,而主要适配的,就是我开头所说的那些。要怎么做?废话说这么多!好吧,咱们开始啦,这里只说我个人比较喜欢用的方法,如果有好的方法,大家可以告诉我,咱们一起研究,

        1. 设置一个基准屏幕分辨率,及对应的密度值;这里我是以480x800,密度值为1.5来定为hdpi base,而密度值为2.0的,则定1280x720的xhdpi为base,好处么?其它相同密度值的分辨率,都比这个要大点,所以,变大了调整布局肯定是比变小的调整要好的。

       2. 在第一个activity的onCreate中,获取当前系统的分辨率,密度值,保存到静态类中,供全局使用:

	private void getSystemPixelsAndDensity(){
		DisplayMetrics dm = getResources().getDisplayMetrics();
		
		CommonData.mCurWidthPixels = dm.widthPixels;
		CommonData.mCurHeightPixels = dm.heightPixels;
		CommonData.mCurDensity = dm.density;
		Log.d(TAG, "CommonData.mCurWidthPixels = " + CommonData.mCurWidthPixels + 
				", CommonData.mCurHeightPixels = " + CommonData.mCurHeightPixels + 
				", CommonData.mCurDensity = " + CommonData.mCurDensity);
	}

        然后,在需要调整的地方,判断一下,并设置控件的LayoutParams即可:

	private void resizeBanner(){
		// 调整 Banner高度,以及PageControl的margin_top
		RelativeLayout layout = (RelativeLayout)rootView.findViewWithTag("bannerbar");
		PageControlView page = (PageControlView)rootView.findViewWithTag("page_control");
		LayoutParams lp = layout.getLayoutParams();
		if(CommonData.mCurDensity == BASE_LCD_DENSITY){
			if(CommonData.mCurHeightPixels != BASE_LCD_HEIGHT || CommonData.mCurWidthPixels != BASE_LCD_WIDTH){
				float scale = (float)CommonData.mCurHeightPixels / (float)BASE_LCD_HEIGHT;
				lp.height *= scale;
				layout.setLayoutParams(lp);

				int pageMarginTop = (int) (BASE_BANNER_PAGE_MARGIN_TOP * BASE_LCD_DENSITY * scale);
				lp = (ViewGroup.LayoutParams) page.getLayoutParams();
				((MarginLayoutParams) lp).setMargins(0, pageMarginTop, 0, 0);
				page.setLayoutParams(lp);
			}
		}else if(CommonData.mCurDensity == BASE_XHDIP_LCD_DENSITY){
			if(CommonData.mCurHeightPixels != BASE_XHDIP_LCD_HEIGHT || 
					CommonData.mCurWidthPixels != BASE_XHDIP_LCD_WIDTH){
				float scale = (float)CommonData.mCurHeightPixels / (float)BASE_XHDIP_LCD_HEIGHT;
				lp.height *= scale;
				layout.setLayoutParams(lp);

				int pageMarginTop = (int) (BASE_XHDIP_BANNER_PAGE_MARGIN_TOP * BASE_XHDIP_LCD_DENSITY * scale);
				lp = (ViewGroup.LayoutParams) page.getLayoutParams();
				((MarginLayoutParams) lp).setMargins(0, pageMarginTop, 0, 0);
				page.setLayoutParams(lp);
			}
		}
	}

        上述代码,是以高度来调整宽度,根据需求不同,调整的方式也不同。比如,将一张图片全屏,就要考虑,图片原始的宽高比,来比例来缩放到屏幕的宽和高上,而不能失帧变形。

2018-04-26 12:33:39 weixin_34310785 阅读数 2

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <input type="text" id="btn" maxlength="25">
</body>
<script>
    var btn = document.getElementById("btn");
    btn.onblur=function(){
        var val = btn.value;
        if(/^[0-9]{11}$/.test(val)){
            console.log("卡号不能为11位");
        }else {
            console.log("正确");
        }
    }
    var tel = document.getElementById('btn');
        tel.onkeyup = function () {
            this.value = this.value.replace(/[^\d.]/g, "");  //只能输入数字或者小数点 
            this.value = this.value.replace(/\.{2,}/g, "."); //只能输入一个点  清除多余的 
            this.value = (this.value.match(/\d{0,7}(\.\d{0,2})?/) || [''])[0]; // 只能以数字开头(且最多只能输入7为整数)小数点后只能留2位;
            if (this.value.indexOf(".") < 0 && this.value != "") {  //如果没有小数点,首位不能为类似于 01、02的金额    
                this.value = parseFloat(this.value);
            }
        }
        var u = navigator.userAgent, app = navigator.appVersion;
        var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器   
        var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端   
        if (isiOS) {
            $("input[type='tel']").attr('type', 'number');
        }
</script>
</html>复制代码

转载于:https://juejin.im/post/5ae1c6ac6fb9a07aa7675e0c

2016-08-03 14:32:09 qq_24731595 阅读数 4636

前言

说实话 开发Android 到现在 第一次遇到这么毫无头绪的问题  Emoji
IOS 各种版本的Emoji
Android 想要一一对应实在是太难了
网上查阅各种资料 下面介绍几个 讲解十分详细的

连接地址:
首先是Android GitHub上的开源项目:https://github.com/rockerhieu/emojicon
这是一个Android Studio项目,并没有提供esclipe的集成方式

(ps: 图片引用GitHub上面的)

其次是一个对GitHub上项目进行 简化的版本

因为我是项目结束才写的这篇文章,其中查阅了好多文章现在想一一找回明显有点不现实。依稀记得提供这个简化版的是我们大CSDN的一个免费下载资源。

资源名称:Emoji表情TextView以及EditText
如果作者看见这篇博客可以在文章的结尾提供链接,我会及时修改我的博客

下面是看过人家的各种资料:

Unified Emoji表情for Android
http://www.cnblogs.com/stay/archive/2012/10/30/2746489.html

Emoji表情符号兼容方案
http://blog.csdn.net/qdkfriend/article/details/7576524

IOS小伙伴给我的一个IOS端的开源项目 讲解的真的是非常详细 不仅仅详细讲解了 IOS如何使用 连Android 的各种坑都有填上
必须点个赞
https://github.com/vbonluk/iOS_Emoji

看人家做的那么好是不是有点小激动,下面开始简单讲些我是怎么集成的

首先自定义EditText TextView分别用于 输入表情和显示表情 直接上重要代码

重写了EditText的onTextChange方法用于输入表情 及时转换成项目统一的表情 由于Emoji有不同的版本
@Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        EmojiHandler.addEmojis(getContext(), getText(), mEmojiconSize);
    }

EmojiHanler 是一个Emoji的帮助类
首先 他会把表情和Unicode编码建立一个SparseIntArray集合 至于为什么不用HashMap 当然是它性能更好咯

直接上代码 太多了就不全复制了

 private static final SparseIntArray sEmojisMap = new SparseIntArray(846);
 private static final SparseIntArray sSoftbanksMap = new SparseIntArray(471);

    static {
        // People
        sEmojisMap.put(0x1f604, R.drawable.emoji_1f604);
        sEmojisMap.put(0x1f603, R.drawable.emoji_1f603);
        sEmojisMap.put(0x1f600, R.drawable.emoji_1f600);
        sEmojisMap.put(0x1f60a, R.drawable.emoji_1f60a);
        sEmojisMap.put(0x263a, R.drawable.emoji_263a);
        sEmojisMap.put(0x1f609, R.drawable.emoji_1f609);
        sEmojisMap.put(0x1f60d, R.drawable.emoji_1f60d);
        sEmojisMap.put(0x1f618, R.drawable.emoji_1f618);
        sEmojisMap.put(0x1f61a, R.drawable.emoji_1f61a);
        sEmojisMap.put(0x1f617, R.drawable.emoji_1f617);
        ...

之后就是要把EditText中输入的表情转换成对应的图片 不过在转之前我们需要知道 他转的是Unicode编码 为什么防止转换问题 我们直接对EditText所有输入的内容进行Unicode编码

/**
     * 字符串转换unicode
     */
    public static String string2Unicode(String string) {

        StringBuffer unicode = new StringBuffer();

        for (int i = 0; i < string.length(); i++) {

            // 取出每一个字符
            char c = string.charAt(i);

            // 转换为unicode
            unicode.append("\\u" + Integer.toHexString(c));
        }

        return unicode.toString();
    }

对输入的Unicode 进行筛查

public static void addEmojis(Context context, Spannable text, int emojiSize) {
        int length = text.length();
        EmojiSpan[] oldSpans = text.getSpans(0, length, EmojiSpan.class);
        for (int i = 0; i < oldSpans.length; i++) {
            text.removeSpan(oldSpans[i]);
        }

        int skip;
        for (int i = 0; i < length; i += skip) {
            skip = 0;
            int icon = 0;
            char c = text.charAt(i);
            if (isSoftBankEmoji(c)) {
                icon = getSoftbankEmojiResource(c);
                skip = icon == 0 ? 0 : 1;
            }

            if (icon == 0) {
                int unicode = Character.codePointAt(text, i);
                skip = Character.charCount(unicode);

                if (unicode > 0xff) {
                    icon = getEmojiResource(context, unicode);
                }

                if (icon == 0 && i + skip < length) {

                    int followUnicode = Character.codePointAt(text, i + skip);
                    if (followUnicode == 0x20e3) {
                        int followSkip = Character.charCount(followUnicode);
                        switch (unicode) {
                            case 0x0031:
                                icon = R.drawable.emoji_0031;
                                break;
                            case 0x0032:
                                icon = R.drawable.emoji_0032;
                                break;
                            case 0x0033:
                                icon = R.drawable.emoji_0033;
                                break;
                            case 0x0034:
                                icon = R.drawable.emoji_0034;
                                break;
                            case 0x0035:
                                icon = R.drawable.emoji_0035;
                                break;
                            case 0x0036:
                                icon = R.drawable.emoji_0036;
                                break;
                            case 0x0037:
                                icon = R.drawable.emoji_0037;
                                break;
                            case 0x0038:
                                icon = R.drawable.emoji_0038;
                                break;
                            case 0x0039:
                                icon = R.drawable.emoji_0039;
                                break;
                            case 0x0030:
                                icon = R.drawable.emoji_0030;
                                break;
                            case 0x0023:
                                icon = R.drawable.emoji_0023;
                                break;
                            default:
                                followSkip = 0;
                                break;
                        }
                        skip += followSkip;
                    } else {
                        int followSkip = Character.charCount(followUnicode);
                        switch (unicode) {
                            case 0x1f1ef:
                                icon = (followUnicode == 0x1f1f5) ? R.drawable.emoji_1f1ef_1f1f5 : 0;
                                break;
                            case 0x1f1fa:
                                icon = (followUnicode == 0x1f1f8) ? R.drawable.emoji_1f1fa_1f1f8 : 0;
                                break;
                            case 0x1f1eb:
                                icon = (followUnicode == 0x1f1f7) ? R.drawable.emoji_1f1eb_1f1f7 : 0;
                                break;
                            case 0x1f1e9:
                                icon = (followUnicode == 0x1f1ea) ? R.drawable.emoji_1f1e9_1f1ea : 0;
                                break;
                            case 0x1f1ee:
                                icon = (followUnicode == 0x1f1f9) ? R.drawable.emoji_1f1ee_1f1f9 : 0;
                                break;
                            case 0x1f1ec:
                                icon = (followUnicode == 0x1f1e7) ? R.drawable.emoji_1f1ec_1f1e7 : 0;
                                break;
                            case 0x1f1ea:
                                icon = (followUnicode == 0x1f1f8) ? R.drawable.emoji_1f1ea_1f1f8 : 0;
                                break;
                            case 0x1f1f7:
                                icon = (followUnicode == 0x1f1fa) ? R.drawable.emoji_1f1f7_1f1fa : 0;
                                break;
                            case 0x1f1e8:
                                icon = (followUnicode == 0x1f1f3) ? R.drawable.emoji_1f1e8_1f1f3 : 0;
                                break;
                            case 0x1f1f0:
                                icon = (followUnicode == 0x1f1f7) ? R.drawable.emoji_1f1f0_1f1f7 : 0;
                                break;
                            default:
                                followSkip = 0;
                                break;
                        }
                        skip += followSkip;
                    }
                }
            }

            if (icon > 0) {
                text.setSpan(new EmojiSpan(context, icon, emojiSize), i, i + skip, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }

网络上获取回来的String 转回Unicode的方法 空格是:\u20

 /**
     * unicode 转字符串
     */
    public static String unicode2String(String unicode) {

        StringBuffer string = new StringBuffer();

        String[] hex = unicode.split("\\\\u");

        for (int i = 1; i < hex.length; i++) {

            if(hex[i].equals("20")){
                string.append(" ");
            }else {
                // 转换出每一个代码点
                int data = Integer.parseInt(hex[i], 16);
                // 追加成string
                string.append((char) data);
            }

        }
        return string.toString();
    }

因为技术有限如果有更好的方式希望可以在博客下面留言 我会及时查阅。谢谢!

贴下需要用的源代码:

class EmojiSpan extends DynamicDrawableSpan {
    private final Context mContext;
    private final int mResourceId;
    private final int mSize;
    private Drawable mDrawable;

    public EmojiSpan(Context context, int resourceId, int size) {
        super();
        mContext = context;
        mResourceId = resourceId;
        mSize = size;
    }

    public Drawable getDrawable() {
        if (mDrawable == null) {
            try {
                mDrawable = mContext.getResources().getDrawable(mResourceId);
                int size = mSize;
                mDrawable.setBounds(0, 0, size, size);
            } catch (Exception e) {
                // swallow
            }
        }
        return mDrawable;
    }
}

因为项目保密的原因 具体代码 不方便分享 有需要demo的小伙伴可以留邮箱。

2017-10-27 10:45:27 qq_20940417 阅读数 132

android 

1px 160ppi


IOS的


iphone8

  • 视网膜高清显示屏
  • 4.7 英寸 (对角线) LCD 宽屏 Multi‑Touch 显示屏,采用 IPS 技术
  • 1334 x 750 像素分辨率,326 ppi
  • 1400:1 对比度 (标准)
iphone8plus

  • 视网膜高清显示屏
  • 5.5 英寸 (对角线) LCD 宽屏 Multi‑Touch 显示屏,采用 IPS 技术
  • 1920 x 1080 像素分辨率,401 ppi
  • 1300:1 对比度 (标准)

iphonex

  • 超视网膜高清显示屏
  • 5.8 英寸 (对角线) OLED 全面屏 Multi-Touch 显示屏
  • HDR 显示

  • 2436 x 1125 像素分辨率,458 ppi
  • 1,000,000:1 对比度 (标准)
  • 原彩显示

  • 广色域显示 (P3)
  • 3D Touch
  • 625 cd/m2 最大亮度 (标准)
  • 采用防油渍防指纹涂层
  • 支持多种语言文字同时显示


Android及ios适配原理总结

阅读数 2314

这里通过对比Android及ios系统解决多机型适配的方法,加深适配问题的理解,如果错误,请指正对已Android系统来说,由于Android的机型很多,屏幕种类各异,为了在不同的Android设备上保持一致的体验,在开发Android的app的时候,需要考虑到app的适配问题。首先,我们需要明确在不同的Android设备上,造成app显示不一样的原因。具体来说,有两个因素影响显示效果

博文 来自: peidonghui

Android、IOS浏览器的适配问题整理

阅读数 371

相关知识点: 移动端、兼容/适配、IOS点击事件300ms延迟、点击穿透、定位失败...手机浏览器特有的事件: onTouchmove、ontouched、ontouchstart、ontouchcancel。使用Zepto的原因: jQuery适用于PC端桌面环境,桌面环境更加复杂,jQuery需要考虑的因素非常多,尤其表现在兼容性上面。与PC...

博文 来自: wei_jia007

ios和android 浏览器适配问题总结

阅读数 358

相关知识点移动端、适配(兼容)、ios点击事件300ms延迟、点击穿透、定位失效......问题&解决方案手机浏览器独有的三个事件?onTouchmove,ontouchend,ontouchstart,ontouchcancel为什么要用Zepto?jquery适用于PC端桌面环境,桌面环境更加复杂,jquery需要考虑的因素非常多,尤其表现在兼容性上面,相对于PC端,移动端的发

博文 来自: hyb1234hi

cocos2d-x 2.x iOS和android多分辨率适配

阅读数 2

cocos2d-x2.xiOS和android多分辨率适配,图片按960x640进行设计CCSizewinSize=CCDirector::sharedDirector()->getWinSize();CCSizedesignSize=CCSizeMake(960,640);//if(designSize.width==1136){//...

博文 来自: weixin_33974433

ios和android 浏览器适配问题总结

阅读数 1394

相关知识点移动端、适配(兼容)、ios点击事件300ms延迟、点击穿透、定位失效......问题&解决方案手机浏览器独有的三个事件?onTouchmove,ontouchend,ontouchstart,ontouchcancel为什么要用Zepto?jquery适用于PC端桌面环境,桌面环境更加复杂,jquery需要考虑的因素非常多,尤其表现在兼容性上面,相对

博文 来自: yezitoo
没有更多推荐了,返回首页