2017-08-17 17:23:22 qiangqin3990 阅读数 3564
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    28202 人正在学习 去看看 秦子恒

应用场景:开发众筹系统的时候,点击捐款按钮弹出金额选择及输入的部分,最新的需求是按微信(ios)返回键和安卓机的返回键,若点开了捐款的选择金额部分,不能返回到上一页,只能隐藏该模块。

延伸:图片插件,点击缩略图放大,这时候点击手机返回键关闭放大的图片。

pushHistory();
window.addEventListener("popstate", function(e) {
    // 点击返回键所触发的逻辑代码
    alert("我点击了手机返回键");
}, false);
function pushHistory() {
    var state = {
        title: "title",
        url: "#"
    };
    window.history.pushState(state, "title", "#");
}


2017-04-07 14:22:08 gaoyaqinglove 阅读数 1295
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    28202 人正在学习 去看看 秦子恒
1.
需要引入weui.js 在点击返回键时,直接退出到公众号页面
  1. window.history.pushState(null,null,"#");
  2. window.addEventListener('popstate',function(e){
  3. WeixinJSBridge.call('closeWindow');
  4. },false
  5. );

2.
点击后退到指定页面
  1. window.history.pushState(null,null,"#");
  2. window.addEventListener("popstate",function(){
  3. var merId = $("#merId").val();
  4. var openId = $("#openId").val();
  5. var url ="queryMore.do?openId="+openId+"&merId="+merId;
  6. location.href=url;
  7. });
2016-11-05 17:14:25 qq_31852701 阅读数 2075
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    28202 人正在学习 去看看 秦子恒

打开微信朋友圈,点击回复按钮,会立马跳出一个回复栏和一个软键盘,点击其他空白处这2个又消失了。这种功能我们怎么实现呢?

类似下面这种功能,由于用的是夜神模拟器,没有软键盘,大家可以自行脑补,或者去自己的朋友圈看看效果。


思路是这样的:点击这个回复状态栏以外的其他区域,让这个回复栏目GONE掉,软键盘没关闭的话,把它关了。

这就涉及到了2个知识点:1、触屏事件分发机制;

                                       2、得到某个View在屏幕上的位置。

Activity中有2个触屏事件分发的相关方法:dispatchTouchEvent()和onTouchEven()。

dispatchTouchEvent()是用来分发事件的,onTouchEven()是用来消费事件的。


一般的事件生命周期是这样的:

1、Activity的dispatchTouchEvent()传递给ViewGrouop的dispatchTouchEvent()

2、ViewGrouop的dispatchTouchEvent()传递给ViewGrouop的onInterceptTouchEven();

3、ViewGrouop的onInterceptTouchEven()判断是否拦截事件,不拦截事件的话分发给ChildView(子View);

4、View的dispatchTouchEvent()判断View有没有消费掉这个事件,然后把结果往上传递。


我们这是在Activity中点击,所以考虑是用Activity的dispatchTouchEvent()还是onTouchEven()。

onTouchEven()是子View以及ViewGroup都不消费事件的时候,传递回Activity才会触发的。若是用户点到了有点击事件的东西(比如上个动图的搜索按钮、回复按钮、返回按钮),那么这个事件就被消费了。Activity就没办法得到这个触摸事件了。所以我们要在Activity的dispatchTouchEvent()方法中做这些逻辑。


然后下面代码说的是如何判断点击的是回复栏之外的区域。用到的是getLocationInWindow这个方法。

可能有人会问为什么不用getLoacationOnScreen(),对于这个项目而言,这个回复栏的父布局就是最外层的Layout,所以用哪个都是一样的。

这里普及下知识:

int[] location = new  int[2] ;
view.getLocationInWindow(location); //获取在当前窗口内的绝对坐标
view.getLocationOnScreen(location); //获取在整个屏幕内的绝对坐标
location [0]--->x坐标
location [1]--->y坐标

  public boolean isShouldHideInput(View v, MotionEvent event)
    {
        if (v != null && (v instanceof RelativeLayout))//这个view就是我们回复栏的布局
        {
            int[] leftTop = new int[2];
            v.getLocationInWindow(leftTop);
            int left = leftTop[0];//回复栏左上角x轴坐标
            int top = leftTop[1];//回复栏左上角y轴坐标
            int bottom = top + v.getHeight();//回复栏右下角x轴坐标
            int right = left + v.getWidth();//回复栏右下角y轴坐标
            if (event.getX() > left && event.getX() < right
                    && event.getY() > top && event.getY() < bottom) return false;
            else return true;
        }
        return false;
    }

最后我们就重写dispatchTouchEvent(),然后当这个回复栏可见,触摸事件是按下,且当前触摸点在这个回复栏之外的时候,执行下面的代码,回复栏GONE掉,软键盘关闭。

 @Override
    public boolean dispatchTouchEvent(MotionEvent ev)
    {
        if (rl_bottom.getVisibility() == View.VISIBLE && ev.getAction() == MotionEvent.ACTION_DOWN && isShouldHideInput(rl_bottom, ev))
            {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null)
                {
                    rl_bottom.setVisibility(View.GONE);
                    imm.hideSoftInputFromWindow(rl_bottom.getWindowToken(), 0);
                }
        }
    return super.dispatchTouchEvent(ev);
    }

然后到这里大家已经懂了吧

2017-10-27 11:25:34 qq_35893839 阅读数 422
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    28202 人正在学习 去看看 秦子恒

最近在项目中调起微信分享返回后,activity走了ondestory(),不知道为什么会走,在几经波折之后发现是因为横竖屏改变了activity的生命周期,在清单文件中修改android:configChanges这个属性即可,再此记录一下,



android中的组件Activity在manifest.xml文件中可以指定参数android:ConfigChanges,用于捕获手机状态的改变。在Activity中添加了android:configChanges属性,在当所指定属性(Configuration Changes)发生改变时,通知程序调用onConfigurationChanged()函数。

设置方法:将下列字段用“|”符号分隔开,例如:“locale|navigation|orientation” 


“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ 所在地区发生变化。
“touchscreen“ 触摸屏已经改变。(这不应该常发生。)
“keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ 用户打开手机硬件键盘
“navigation“ 导航型发生了变化。(这不应该常发生。)
“orientation“ 设备旋转,横向显示和竖向显示模式切换。
“fontScale“ 全局字体大小缩放发生改变

对android:configChanges属性,一般认为有以下几点:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

但是,自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"。
解决方法:
AndroidManifest.xml中设置android:configChanges="orientation|screenSize“

2017-09-28 11:11:35 h5liangliang 阅读数 241
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    28202 人正在学习 去看看 秦子恒
var as='pop-in';// 默认窗口动画
function plusReady(){
// 隐藏滚动条
plus.webview.currentWebview().setStyle({scrollIndicator:'none'});
// Android处理返回键
plus.key.addEventListener('backbutton',function(){
if(confirm('确认退出?')){
plus.runtime.quit();
}
},false);
compatibleAdjust();
}
if(window.plus){
plusReady();
}else{
document.addEventListener('plusready',plusReady,false);
}
// DOMContentLoaded事件处理
var _domReady=false;
document.addEventListener('DOMContentLoaded',function(){
_domReady=true;
compatibleAdjust();
},false);
// 兼容性样式调整
var _adjust=false;
function compatibleAdjust(){
if(_adjust||!window.plus||!_domReady){
return;
}
_adjust=true;
// iOS平台特效
if('iOS'==plus.os.name){
document.getElementById('content').className='scontent'; // 使用div的滚动条
if(navigator.userAgent.indexOf('StreamApp')>=0){ // 在流应用模式下显示返回按钮
document.getElementById('back').style.visibility='visible';
}
}
// 预创建二级窗口
// preateWebviews();
// 关闭启动界面
setTimeout(function(){
plus.navigator.closeSplashscreen();
plus.navigator.setStatusBarBackground('#FFFFFF');
if(plus.navigator.isImmersedStatusbar()){
plus.navigator.setStatusBarStyle('UIStatusBarStyleBlackOpaque');
}
},500);
}
// 处理点击事件
var _openw=null;
function clicked(id,a,s){
if(_openw){return;}
a||(a=as);
_openw=preate[id];
if(_openw){
_openw.showded=true;
_openw.show(a,null,function(){
_openw=null;//避免快速点击打开多个页面
});
}else{
// var wa=plus.nativeUI.showWaiting();
_openw=plus.webview.create(id,id,{scrollIndicator:'none',scalable:false,popGesture:'hide'},{preate:true});
preate[id]=_openw;
_openw.addEventListener('loaded',function(){//叶面加载完成后才显示
// setTimeout(function(){//延后显示可避免低端机上动画时白屏
// wa.close();
_openw.showded=true;
s||_openw.show(a,null,function(){
_openw=null;//避免快速点击打开多个页面
});
s&&(_openw=null);//避免s模式下变量无法重置
// },10);
},false);
_openw.addEventListener('hide',function(){
_openw&&(_openw.showded=true);
_openw=null;
},false);
_openw.addEventListener('close',function(){//页面关闭后可再次打开
_openw=null;
preate[id]&&(preate[id]=null);//兼容窗口的关闭
},false);
}
}
// 预创建二级页面
var preate={};
function preateWebviews(){
preateWebivew('plus/webview.html');
var plist=document.getElementById('plist').children;
// 由于启动是预创建过多Webview窗口会消耗较长的时间,所以这里限制仅创建5个
for( var i=0;i<plist.length&&i<2;i++){
var id=plist[i].id;
id&&(id.length>0)&&preateWebivew(id);
}
}
function preateWebivew(id){
if(!preate[id]){
var w=plus.webview.create(id,id,{scrollIndicator:'none',scalable:false,popGesture:'hide'},{preate:true});
preate[id]=w;
w.addEventListener('close',function(){//页面关闭后可再次打开
_openw=null;
preate[id]&&(preate[id]=null);//兼容窗口的关闭
},false);
}
}
// 清除预创建页面(仅)
function preateClear(){
for(var p in preate){
var w=preate[p];
if(w&&w.showded&&!w.isVisible()){
w.close();
preate[p]=null;
}
}
}
</script>

为什么80%的码农都做不了架构师?>>> ...

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