Android开发中如何调用摄像头的功能_东风破_新浪博客

mikel阅读(1166)

Android开发中如何调用摄像头的功能_东风破_新浪博客,东风破,

来源: Android开发中如何调用摄像头的功能_东风破_新浪博客

我们要调用摄像头的拍照功能,显然
第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码
    <uses-permission android:name=”android.permission.CAMERA”/>//摄像头权限
    SD卡读写权限
    <uses-permission android:name=”android.permission.MOUNT_UNMOUNT_FILESYSTEMS” />
    <uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>
第二步,要将摄像头捕获的图像实时地显示在手机上。
我们是用SurfaceView这个视图组件来实现的,因此在main.xml中加入下列代码
<SurfaceView  
    android:layout_width=”fill_parent” 
    android:layout_height=”fill_parent” 
    android:id=”@+id/surfaceview”
 />
第三步,设置窗口的显示方式
    首先获得当前窗口 Window window = getWindow();//得到窗口
    接着设置没有标题 requestWindowFeature(Window.FEATURE_NO_TITLE);//没有标题
    接着设置全屏 window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
    当然,我们在拍照过程中,屏幕必须一致处于高亮状态,因此接着加入下面代码
   window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//设置高亮
至此,我们将窗口的显示方式规定死了,然后才能设置窗口上显示的组件(顺序非常重要)
 setContentView(R.layout.main);
第四步,设置SurficeView显示控件的属性
   找到surficeView
   surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
   设置它的像素为800×600
   surfaceView.getHolder().setFixedSize(800, 480);
  //下面设置surfaceView不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
第五步,就是为surficeView加入回调方法(callBack)
surfaceView.getHolder().addCallback(new SurfaceCallback());
上面的回调类是我们自己定义的,代码如下
private class SurfaceCallback implements SurfaceHolder.Callback{
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();//打开硬件摄像头,这里导包得时候一定要注意是android.hardware.Camera
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);//得到窗口管理器
Display display  = wm.getDefaultDisplay();//得到当前屏幕
Camera.Parameters parameters = camera.getParameters();//得到摄像头的参数
parameters.setPreviewSize(display.getWidth(), display.getHeight());//设置预览照片的大小
parameters.setPreviewFrameRate(3);//设置每秒3帧
parameters.setPictureFormat(PixelFormat.JPEG);//设置照片的格式
parameters.setJpegQuality(85);//设置照片的质量
parameters.setPictureSize(display.getHeight(), display.getWidth());//设置照片的大小,默认是和     屏幕一样大
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceView.getHolder());//通过SurfaceView显示取景画面
camera.startPreview();//开始预览
isPreview = true;//设置是否预览参数为真
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
               
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera!=null){
if(isPreview){//如果正在预览 
camera.stopPreview();
camera.release();
}
}
}
   
    }
第六步,我们必须对按键事件进行监听,如是拍照还是聚焦,代码如下
public boolean onKeyDown(int keyCode, KeyEvent event) {//处理按键事件
if(camera!=null&&event.getRepeatCount()==0)//代表只按了一下
{
switch(keyCode){
case KeyEvent.KEYCODE_BACK://如果是搜索键
     camera.autoFocus(null);//自动对焦
  break;
   case KeyEvent.KEYCODE_DPAD_CENTER://如果是中间键
     camera.takePicture(null, null, new TakePictureCallback());//将拍到的照片给第三个对象中,这里的TakePictureCallback()是自己定义的,在下面的代码中
 break;
}
}
return true;//阻止事件往下传递,否则按搜索键会变成系统默认的
}
——————————————————————————————
private final class TakePictureCallback implements PictureCallback{
public void onPictureTaken(byte[] data, Camera camera) {
try {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+”.jpg”);
FileOutputStream outputStream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, outputStream);
outputStream.close();
camera.stopPreview();
camera.startPreview();//处理完数据之后可以预览
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
}
注意,代码中有两个回调类,一个是SurfaceCallback(),另外一个是TakePictureCallback(),初学者可能一时难以理解,通俗地讲,前者是用来监视surficeView这个暂时存放图片数据的显示控件的,根据它的显示情况调用不同的方法,包括surfaceCreated(),surfaceChanged(),surfaceDestroyed(),也就不难理解为什么会有这三个回调方法了(注意,在surfaceDestroyed()方法中必须释放摄像头,详细代码参见上方)。TakePictureCallback()是为了监视是否拍照而设计的接口,期中也仅有一个方法,camera将拍照得到的数据传入方法,我们便可以对拍照得到的数据进行进一步处理了。
至此,简单的拍照功能介绍完毕!
源码已经托管在 geakit上面
https://geakit.com/yuchao/android_camera 欢迎下载

Android Studio调试功能使用总结【转】 - 小氕 - 博客园

mikel阅读(1222)

来源: Android Studio调试功能使用总结【转】 – 小氕 – 博客园

这段时间一直在使用Intellij IDEA, 今天把调试区工具的使用方法记录于此。

 

先编译好要调试的程序。

1.设置断点

选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。

 

2.开启调试会话

点击红色箭头指向的小虫子,开始进入调试。

 

IDE下方出现Debug视图,红色的箭头指向的是现在调试程序停留的代码行,方法f2()中,程序的第11行。红色箭头悬停的区域是程序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。

 

3.单步调试

3.1 step over

点击红色箭头指向的按钮,程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行)

3.2 step into

点击红色箭头指向的按钮,程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。具体步骤如下:

在自定义方法发f1()处设置断点,执行调试

 

 

点击

 

3.3 Force step into

该按钮在调试的时候能进入任何方法。

3.4 step out

 

如果在调试的时候你进入了一个方法(如f2()),并觉得该方法没有问题,你就可以使用stepout跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。

3.5 Drop frame

 

点击该按钮后,你将返回到当前方法的调用处(如上图,程序会回到main()中)重新执行,并且所有上下文变量的值也回到那个时候。只要调用链中还有上级方法,可以跳到其中的任何一个方法。

4. 高级调试

4.1 跨断点调试

设置多个断点,开启调试。

 

想移动到下一个断点,点击如下图:

程序将运行一个断点到下一个断点之间需要执行的代码。如果后面代码没有断点,再次点击该按钮将会执行完程序。

4.2 查看断点

 

点击箭头指向的按钮,可以查看你曾经设置过的断点并可设置断点的一些属性。

箭头1指向的是你曾经设置过的断点,箭头2可以设置条件断点(满足某个条件的时候,暂停程序的执行,如 c==97)。结束调试后,应该在箭头1处把所设的断点删除(选择要删除的断点后,点击上方的红色减号)。

 

4.3 设置变量值

 

调试开始后,在红箭头指向的区域可以给指定的变量赋值(鼠标左键选择变量,右键弹出菜单选择setValue…)。这个功能可以更加快速的检测你的条件语句和循环语句。

 

alt+f8 Debug时选中查看值
f8相当于eclipse的f6跳到下一步
shift+f8相当于eclipse的f8跳到下一个断点,也相当于eclipse的f7跳出函数
f7相当于eclipse的f5就是进入到代码
alt+shift+f7这个是强制进入代码
ctrl+shift+f9 debug运行java类
ctrl+shift+f10正常运行java类
command+f2停止运行

http://www.cnblogs.com/Bowu/p/4026117.html

android studio 设备调试及Logcat查看 - 阿炮君 - 博客园

mikel阅读(1125)

来源: android studio 设备调试及Logcat查看 – 阿炮君 – 博客园

现在Android的开发工具基本上都改用Android studio而慢慢弃用eclipse了,那么Android studio的调试设备该怎么设置和查看程序的Logcat呢?

 

首先点击项目上方app右边的小箭头,然后选择”Edit Configurations…”,如下图:

然后选择

Show chooser dialog : 弹出窗口,可选择真机调试或虚拟机调试。

Use same device for futrue launches : 选中的话,当下次调试时,会使用之前相同的调试方式。

USB device : 使用真机调试。

Emulator : 使用虚拟机调试。

Prefer Android Virtual Device : 可选择已经存在的虚拟机,点击右边”…” 弹出AVD Manager(要在选择Emulator后才可点击)。

 

当程序运行后,我们需要在调试的时候查看Logcat的信息,点击android studio 底部的Android按钮,会弹出一个调试的窗口。

在Device栏中,可以看到当前连接的可调试的设备,有时候设备连接USB后,并没有显示出来,这个时候可以在这里查看。

当需要查看程序运行的Logcat时,可以点击窗口右上角的android图标,程序运行的信息都在这里。

最详细的Android Studio百度地图(BaiduMap)开发教程,可以用作官方文档的教程! - 孙一一的专栏 - 博客频道 - CSDN.NET

mikel阅读(1655)

由于工作原因,需要用到地图模块,之前一直是用Eclipse开发百度地图, 在Eclipse环境下搭建百度地图,只要按照百度地图官网一步步配置就可以了,相对来说很简单,但是由于现在开发工具切换到了AndroidStudio,百度地图开发环境的搭建就不是那么容易了,主要还是因为Studio下apk的签名文件导致百度地图key的申请和Eclipse不一样,从而造成App运行或者上线后出现Key的验证出错

来源: 最详细的Android Studio百度地图(BaiduMap)开发教程,可以用作官方文档的教程! – 孙一一的专栏 – 博客频道 – CSDN.NET

由于工作原因,需要用到地图模块,之前一直是用Eclipse开发百度地图,
在Eclipse环境下搭建百度地图,只要按照百度地图官网一步步配置就可以了,相对来说很简单,但是由于现在开发工具切换到了AndroidStudio,百度地图开发环境的搭建就不是那么容易了,主要还是因为Studio下apk的签名文件导致百度地图key的申请和Eclipse不一样,从而造成App运行或者上线后出现Key的验证出错,地图界面只有一片空白的格子的现象.出现百度地图230错误,APP Scode校验失败.

如下图所示:
这里写图片描述

就是这个错误浪费了我不少时间!
其实网上也有不少大牛说出了解决办法,但是总是一带而过,不够详细,为了其他开发百度地图的孩儿少走弯路,避免浪费不必要的时间,我就写了这篇博客,不足和有误之处,还望各位海涵!

一.创建一个Android Studio项目:

这里写图片描述

二.申请百度地图key.

此处需要重点注意,由于Studio和Eclipse的开发环境不同,导致Sha1值的获取有差异,在Studio下无法像Eclipse那样获取Sha1值.
而且Studio中默认安装运行的apk是Debug版本,不是release版的,Debug版的apk有默认的Debug.keystore签名,和release版的签名是不一样的.
所以如果采用的是百度地图官网提供的获取签名的方法,是获得的默认的debug版的签名,不是正式的签名.
如果我们开发的app就是自己玩玩,那么采用默认的debug签名来获取Sha1值就可以了,但是如果我们要正式发布,则需要用release版的签名来获取Sha1值才行.
我这里直接通过release签名文件来获取Sha1值,和实际开发一致.

1.创建release版的签名文件:

在Eclipse中,签名文件的后缀是.keystore,而Studio中的签名是.jks.
所以先去Builde菜单下生成一个正式的.jks签名文件.

这里写图片描述

选择Create new…生成一个新的签名文件:

这里写图片描述

这个跟eclipse下生成签名文件是一样的.不多说.

这里写图片描述

OK之后直接是如下界面,填写好刚才的信息即可.

这里写图片描述

Next下一步,出现如下界面:
如果进行了多渠道打包配置,则在Flavors中进行选择即可.

这里写图片描述

2.进行release版签名的验证,生成正式签名的apk:

点击Project Structure菜单,选择Signing签名选项:
填写各种签名信息即可.

这里写图片描述

此时在builde.gradle文件中就多了对正式签名文件的配置引用:
注意要在buildTypes中添加对正式签名配置的引用.
signingConfig signingConfigs.release

这里写图片描述

3.申请百度地图的key:

在命令行中按照百度地图的获取Sha1的命令,进入到正式签名文件的路径,执行keytool命令,得到Sha1值:

这里写图片描述

至此得到了正式签名的Sha1值.利用这个值就可以去百度官网申请Key了.

这里写图片描述

去百度控制台申请Key,填上Sha1和包名,至此,生成所需要的Key:

这里写图片描述

这里写图片描述

三.配置开发环境:

接下来就按照百度地图官网的步骤把开发环境搭建好就可以了.

1.引入所需jar包和so库.
注意此处要将jar包添加为类库.
在main目录下直接创建jniLibs目录,然后把各种.so库拷贝进来即可,
不用看百度官网说的那一堆废话(此处严重鄙视百度的API文档,简直就是一堆狗屎,和高德的文档一比,菜的不行,写这个文档的也不知道怎么进的百度).

这里写图片描述

注意:需要将jar包作为类库添加到studio的依赖库中.

2.配置其他所需要的权限和key:

这里写图片描述

这里写图片描述

3.编译运行安装apk:

我这里直接在Gradle里直接build和install项目了.

这里写图片描述

安装运行APK文件:

这里写图片描述

得到最终结果:
出现这个界面说明环境搭建完毕,可以继续其他地图功能的实现了.

这里写图片描述

最后就是运行结果.博客中如有不当之处,希望各位可以不吝赐教,共同学习和探讨,谢谢!

Android Studio下加入百度地图的使用 (一)——环境搭建 - 杰瑞教育 - 博客园

mikel阅读(897)

来源: Android Studio下加入百度地图的使用 (一)——环境搭建 – 杰瑞教育 – 博客园

最近有学生要做毕业设计,会使用到定位及地图信息的功能,特此研究了一下,供大家参考,百度定位SDK已经更新到了5.0,地图SDK已经更新到了3.5,但是在AndroidStudio中使用还是存在一些不稳定的情况,本章我们使用定位SDK 4.0,MAP SDK 3.0,下面我们开始搭建环境。

第一步:申请Key

百度地图Android SDK提供的所有服务是免费的,接口使用无次数限制。但是需申请密钥(key)后, 才可使用百度地图Android SDK。而且必须要注册一个百度账号。

网址: http://lbsyun.baidu.com/apiconsole/key

在此画面中点击创建应用

在此画面中选择应用类型,并且输入安全码

  安全码的输入规则是:

  Android签名证书的sha1值+“;”+packagename(即:数字签名+分号+包名),

  获取sha1值:

运行进入控制台

进入.android(参照下图):输入keytool -list -v -keystore Debug.keystore ,密码是  android

 

包名去AndroidMainifest.xml中复制

成功创建KEY

在输入安全码后,点击“确定”完成应用的配置工作,会得到一个创建的Key。

第二步: 下载百度SDK

下载地址: http://developer.baidu.com/map/index.php?title=androidsdk/sdkandev-download

第三步: Android Studio工程配置方法

1、在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,放入 libBaiduMapSDK_vX_X_X_X.so如下图所示,注意jar和so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文 件,不能不同功能组件的jar或so交叉使用。

 

2、导入jar包。菜单栏选择File->Project Structor->Modules->Dependencies,点击+号,选择File dependency,选择jar包导入。

第四步: 在AndroidMainifest.xml中加入Key

<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="输入申请的key" />

到此环境搭建完毕,下一章我们来研究一下如何使用。

Error running app: This version of Android Studio is incompatible with the Gradle Plugin used. Try d - 木木baby的博客 - 博客频道 - CSDN.NET

mikel阅读(1203)

这个问题我出现的时候是由于更新AS版本的时候出现的,翻译过来就是说,这个版本不兼容一些插件。可以这样解决,看图示:

来源: Error running app: This version of Android Studio is incompatible with the Gradle Plugin used. Try d – 木木baby的博客 – 博客频道 – CSDN.NET

Error running app: This version of Android Studio is incompatible with the Gradle Plugin used. Try disabling Instant Run (or updating either the IDE or the Gradle plugin to the latest version

这个问题我出现的时候是由于更新AS版本的时候出现的,翻译过来就是说,这个版本不兼容一些插件。

可以这样解决,看图示:

移动前端开发之viewport的深入理解 - 无双 - 博客园

mikel阅读(1121)

来源: 移动前端开发之viewport的深入理解 – 无双 – 博客园

在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或响应各种不同分辨率的移动设备。

一、viewport的概念

通俗的讲,移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,在具体一点,就是浏览器上(也可能是一个app中的webview)用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区域要大,也可能比浏览器的可视区域要小。在默认情况下,一般来讲,移动设备上的viewport都是要大于浏览器可视区域的,这是因为考虑到移动设备的分辨率相对于桌面电脑来说都比较小,所以为了能在移动设备上正常显示那些传统的为桌面浏览器设计的网站,移动设备上的浏览器都会把自己默认的viewport设为980px或1024px(也可能是其它值,这个是由设备自己决定的),但带来的后果就是浏览器会出现横向滚动条,因为浏览器可视区域的宽度是比这个默认的viewport的宽度要小的。下图列出了一些设备上浏览器的默认viewport的宽度。

1

 

二、css中的1px并不等于设备的1px

在css中我们一般使用px作为单位,在桌面浏览器中css的1个像素往往都是对应着电脑屏幕的1个物理像素,这可能会造成我们的一个错觉,那就是css中的像素就是设备的物理像素。但实际情况却并非如此,css中的像素只是一个抽象的单位,在不同的设备或不同的环境中,css中的1px所代表的设备物理像素是不同的。在为桌面浏览器设计的网页中,我们无需对这个津津计较,但在移动设备上,必须弄明白这点。在早先的移动设备中,屏幕像素密度都比较低,如iphone3,它的分辨率为320×480,在iphone3上,一个css像素确实是等于一个屏幕物理像素的。后来随着技术的发展,移动设备的屏幕像素密度越来越高,从iphone4开始,苹果公司便推出了所谓的Retina屏,分辨率提高了一倍,变成640×960,但屏幕尺寸却没变化,这就意味着同样大小的屏幕上,像素却多了一倍,这时,一个css像素是等于两个物理像素的。其他品牌的移动设备也是这个道理。例如安卓设备根据屏幕像素密度可分为ldpi、mdpi、hdpi、xhdpi等不同的等级,分辨率也是五花八门,安卓设备上的一个css像素相当于多少个屏幕物理像素,也因设备的不同而不同,没有一个定论。

还有一个因素也会引起css中px的变化,那就是用户缩放。例如,当用户把页面放大一倍,那么css中1px所代表的物理像素也会增加一倍;反之把页面缩小一倍,css中1px所代表的物理像素也会减少一倍。关于这点,在文章后面的部分还会讲到。

在移动端浏览器中以及某些桌面浏览器中,window对象有一个devicePixelRatio属性,它的官方的定义为:设备物理像素和设备独立像素的比例,也就是 devicePixelRatio = 物理像素 / 独立像素。css中的px就可以看做是设备的独立像素,所以通过devicePixelRatio,我们可以知道该设备上一个css像素代表多少个物理像素。例如,在Retina屏的iphone上,devicePixelRatio的值为2,也就是说1个css像素相当于2个物理像素。但是要注意的是,devicePixelRatio在不同的浏览器中还存在些许的兼容性问题,所以我们现在还并不能完全信赖这个东西,具体的情况可以看下这篇文章

devicePixelRatio的测试结果:

14

 

三、PPK的关于三个viewport的理论

ppk大神对于移动设备上的viewport有着非常多的研究(第一篇第二篇第三篇),有兴趣的同学可以去看一下,本文中有很多数据和观点也是出自那里。ppk认为,移动设备上有三个viewport。

首先,移动设备上的浏览器认为自己必须能让所有的网站都正常显示,即使是那些不是为移动设备设计的网站。但如果以浏览器的可视区域作为viewport的话,因为移动设备的屏幕都不是很宽,所以那些为桌面浏览器设计的网站放到移动设备上显示时,必然会因为移动设备的viewport太窄,而挤作一团,甚至布局什么的都会乱掉。也许有人会问,现在不是有很多手机分辨率都非常大吗,比如768×1024,或者1080×1920这样,那这样的手机用来显示为桌面浏览器设计的网站是没问题的吧?前面我们已经说了,css中的1px并不是代表屏幕上的1px,你分辨率越大,css中1px代表的物理像素就会越多,devicePixelRatio的值也越大,这很好理解,因为你分辨率增大了,但屏幕尺寸并没有变大多少,必须让css中的1px代表更多的物理像素,才能让1px的东西在屏幕上的大小与那些低分辨率的设备差不多,不然就会因为太小而看不清。所以在1080×1920这样的设备上,在默认情况下,也许你只要把一个div的宽度设为300多px(视devicePixelRatio的值而定),就是满屏的宽度了。回到正题上来,如果把移动设备上浏览器的可视区域设为viewport的话,某些网站就会因为viewport太窄而显示错乱,所以这些浏览器就决定默认情况下把viewport设为一个较宽的值,比如980px,这样的话即使是那些为桌面设计的网站也能在移动浏览器上正常显示了。ppk把这个浏览器默认的viewport叫做 layout viewport这个layout viewport的宽度可以通过 document.documentElement.clientWidth 来获取。

然而,layout viewport 的宽度是大于浏览器可视区域的宽度的,所以我们还需要一个viewport来代表 浏览器可视区域的大小,ppk把这个viewport叫做 visual viewport。visual viewport的宽度可以通过window.innerWidth 来获取,但在Android 2, Oprea mini 和 UC 8中无法正确获取。

2      3

现在我们已经有两个viewport了:layout viewportvisual viewport。但浏览器觉得还不够,因为现在越来越多的网站都会为移动设备进行单独的设计,所以必须还要有一个能完美适配移动设备的viewport。所谓的完美适配指的是,首先不需要用户缩放和横向滚动条就能正常的查看网站的所有内容;第二,显示的文字的大小是合适,比如一段14px大小的文字,不会因为在一个高密度像素的屏幕里显示得太小而无法看清,理想的情况是这段14px的文字无论是在何种密度屏幕,何种分辨率下,显示出来的大小都是差不多的。当然,不只是文字,其他元素像图片什么的也是这个道理。ppk把这个viewport叫做 ideal viewport,也就是第三个viewport——移动设备的理想viewport。

ideal viewport并没有一个固定的尺寸,不同的设备拥有有不同的ideal viewport。所有的iphone的ideal viewport宽度都是320px,无论它的屏幕宽度是320还是640,也就是说,在iphone中,css中的320px就代表iphone屏幕的宽度。

4          5

但是安卓设备就比较复杂了,有320px的,有360px的,有384px的等等,关于不同的设备ideal viewport的宽度都为多少,可以到http://viewportsizes.com去查看一下,里面收集了众多设备的理想宽度。

再总结一下:ppk把移动设备上的viewport分为layout viewport  、 visual viewport   ideal viewport  三类,其中的ideal viewport是最适合移动设备的viewport,ideal viewport的宽度等于移动设备的屏幕宽度,只要在css中把某一元素的宽度设为ideal viewport的宽度(单位用px),那么这个元素的宽度就是设备屏幕的宽度了,也就是宽度为100%的效果。ideal viewport 的意义在于,无论在何种分辨率的屏幕下,那些针对ideal viewport 而设计的网站,不需要用户手动缩放,也不需要出现横向滚动条,都可以完美的呈现给用户。

 

四、利用meta标签对viewport进行控制

移动设备默认的viewport是layout viewport,也就是那个比屏幕要宽的viewport,但在进行移动设备网站的开发时,我们需要的是ideal viewport。那么怎么才能得到ideal viewport呢?这就该轮到meta标签出场了。

我们在开发移动设备的网站时,最常见的的一个动作就是把下面这个东西复制到我们的head标签中:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">

该meta标签的作用是让当前viewport的宽度等于设备的宽度,同时不允许用户手动缩放。也许允不允许用户缩放不同的网站有不同的要求,但让viewport的宽度等于设备的宽度,这个应该是大家都想要的效果,如果你不这样的设定的话,那就会使用那个比屏幕宽的默认viewport,也就是说会出现横向滚动条。

这个name为viewport的meta标签到底有哪些东西呢,又都有什么作用呢?

meta viewport 标签首先是由苹果公司在其safari浏览器中引入的,目的就是解决移动设备的viewport问题。后来安卓以及各大浏览器厂商也都纷纷效仿,引入对meta viewport的支持,事实也证明这个东西还是非常有用的。

在苹果的规范中,meta viewport 有6个属性(暂且把content中的那些东西称为一个个属性和值),如下:

width 设置layout viewport  的宽度,为一个正整数,或字符串”width-device”
initial-scale 设置页面的初始缩放值,为一个数字,可以带小数
minimum-scale 允许用户的最小缩放值,为一个数字,可以带小数
maximum-scale 允许用户的最大缩放值,为一个数字,可以带小数
height 设置layout viewport  的高度,这个属性对我们并不重要,很少使用
user-scalable 是否允许用户进行缩放,值为”no”或”yes”, no 代表不允许,yes代表允许

这些属性可以同时使用,也可以单独使用或混合使用,多个属性同时使用时用逗号隔开就行了。

此外,在安卓中还支持  target-densitydpi  这个私有属性,它表示目标设备的密度等级,作用是决定css中的1px代表多少物理像素

target-densitydpi 值可以为一个数值或 high-dpi 、 medium-dpi、 low-dpi、 device-dpi 这几个字符串中的一个

特别说明的是,当 target-densitydpi=device-dpi 时, css中的1px会等于物理像素中的1px。

因为这个属性只有安卓支持,并且安卓已经决定要废弃target-densitydpi  这个属性了,所以这个属性我们要避免进行使用  。

 

五、把当前的viewport宽度设置为 ideal viewport 的宽度

要得到ideal viewport就必须把默认的layout viewport的宽度设为移动设备的屏幕宽度。因为meta viewport中的width能控制layout viewport的宽度,所以我们只需要把width设为width-device这个特殊的值就行了。

<meta name="viewport" content="width=device-width">

下图是这句代码在各大移动端浏览器上的测试结果:

6

可以看到通过width=device-width,所有浏览器都能把当前的viewport宽度变成ideal viewport的宽度,但要注意的是,在iphone和ipad上,无论是竖屏还是横屏,宽度都是竖屏时ideal viewport的宽度。

这样的写法看起来谁都会做,没吃过猪肉,谁还没见过猪跑啊~,确实,我们在开发移动设备上的网页时,不管你明不明白什么是viewport,可能你只需要这么一句代码就够了。

可是你肯定不知道

<meta name="viewport" content="initial-scale=1">

这句代码也能达到和前一句代码一样的效果,也可以把当前的的viewport变为 ideal viewport。

呵呵,傻眼了吧,因为从理论上来讲,这句代码的作用只是不对当前的页面进行缩放,也就是页面本该是多大就是多大。那为什么会有 width=device-width 的效果呢?

要想清楚这件事情,首先你得弄明白这个缩放是相对于什么来缩放的,因为这里的缩放值是1,也就是没缩放,但却达到了 ideal viewport 的效果,所以,那答案就只有一个了,缩放是相对于 ideal viewport来进行缩放的,当对ideal viewport进行100%的缩放,也就是缩放值为1的时候,不就得到了 ideal viewport吗?事实证明,的确是这样的。下图是各大移动端的浏览器当设置了<meta name=”viewport” content=”initial-scale=1″> 后是否能把当前的viewport宽度变成 ideal viewport 的宽度的测试结果。

7

测试结果表明 initial-scale=1 也能把当前的viewport宽度变成 ideal viewport 的宽度,但这次轮到了windows phone 上的IE 无论是竖屏还是横屏都把宽度设为竖屏时ideal viewport的宽度。但这点小瑕疵已经无关紧要了。

但如果width 和 initial-scale=1同时出现,并且还出现了冲突呢?比如:

<meta name="viewport" content="width=400, initial-scale=1">

width=400表示把当前viewport的宽度设为400px,initial-scale=1则表示把当前viewport的宽度设为ideal viewport的宽度,那么浏览器到底该服从哪个命令呢?是书写顺序在后面的那个吗?不是。当遇到这种情况时,浏览器会取它们两个中较大的那个值。例如,当width=400,ideal viewport的宽度为320时,取的是400;当width=400, ideal viewport的宽度为480时,取的是ideal viewport的宽度。(ps:在uc9浏览器中,当initial-scale=1时,无论width属性的值为多少,此时viewport的宽度永远都是ideal viewport的宽度)

最后,总结一下,要把当前的viewport宽度设为ideal viewport的宽度,既可以设置 width=device-width,也可以设置 initial-scale=1,但这两者各有一个小缺陷,就是iphone、ipad以及IE 会横竖屏不分,通通以竖屏的ideal viewport宽度为准。所以,最完美的写法应该是,两者都写上去,这样就 initial-scale=1 解决了 iphone、ipad的毛病,width=device-width则解决了IE的毛病:

<meta name="viewport" content="width=device-width, initial-scale=1">

 

六、关于meta viewport的更多知识

1、关于缩放以及initial-scale的默认值

首先我们先来讨论一下缩放的问题,前面已经提到过,缩放是相对于ideal viewport来缩放的,缩放值越大,当前viewport的宽度就会越小,反之亦然。例如在iphone中,ideal viewport的宽度是320px,如果我们设置 initial-scale=2 ,此时viewport的宽度会变为只有160px了,这也好理解,放大了一倍嘛,就是原来1px的东西变成2px了,但是1px变为2px并不是把原来的320px变为640px了,而是在实际宽度不变的情况下,1px变得跟原来的2px的长度一样了,所以放大2倍后原来需要320px才能填满的宽度现在只需要160px就做到了。因此,我们可以得出一个公式:

visual viewport宽度 = ideal viewport宽度  / 当前缩放值

当前缩放值 = ideal viewport宽度  / visual viewport宽度

ps: visual viewport的宽度指的是浏览器可视区域的宽度。

大多数浏览器都符合这个理论,但是安卓上的原生浏览器以及IE有些问题。安卓自带的webkit浏览器只有在 initial-scale = 1 以及没有设置width属性时才是表现正常的,也就相当于这理论在它身上基本没用;而IE则根本不甩initial-scale这个属性,无论你给他设置什么,initial-scale表现出来的效果永远是1。

好了,现在再来说下initial-scale的默认值问题,就是不写这个属性的时候,它的默认值会是多少呢?很显然不会是1,因为当 initial-scale = 1 时,当前的layout viewport宽度会被设为 ideal viewport的宽度,但前面说了,各浏览器默认的 layout viewport宽度一般都是980啊,1024啊,800啊等等这些个值,没有一开始就是 ideal viewport的宽度的,所以 initial-scale的默认值肯定不是1。安卓设备上的initial-scale默认值好像没有方法能够得到,或者就是干脆它就没有默认值,一定要你显示的写出来这个东西才会起作用,我们不管它了,这里我们重点说一下iphone和ipad上的initial-scale默认值。

根据测试,我们可以在iphone和ipad上得到一个结论,就是无论你给layout viewpor设置的宽度是多少,而又没有指定初始的缩放值的话,那么iphone和ipad会自动计算initial-scale这个值,以保证当前layout viewport的宽度在缩放后就是浏览器可视区域的宽度,也就是说不会出现横向滚动条。比如说,在iphone上,我们不设置任何的viewport meta标签,此时layout viewport的宽度为980px,但我们可以看到浏览器并没有出现横向滚动条,浏览器默认的把页面缩小了。根据上面的公式,当前缩放值 = ideal viewport宽度  / visual viewport宽度,我们可以得出:

当前缩放值 = 320 / 980

也就是当前的initial-scale默认值应该是 0.33这样子。当你指定了initial-scale的值后,这个默认值就不起作用了。

总之记住这个结论就行了:在iphone和ipad上,无论你给viewport设的宽的是多少,如果没有指定默认的缩放值,则iphone和ipad会自动计算这个缩放值,以达到当前页面不会出现横向滚动条(或者说viewport的宽度就是屏幕的宽度)的目的。

11    12     13

 

2、动态改变meta viewport标签

第一种方法

可以使用document.write来动态输出meta viewport标签,例如:

document.write('<meta name="viewport" content="width=device-width,initial-scale=1">')

第二种方法

通过setAttribute来改变

<meta id="testViewport" name="viewport" content="width = 380">
<script>
var mvp = document.getElementById('testViewport');
mvp.setAttribute('content','width=480');
</script>

 

安卓2.3自带浏览器上的一个bug

复制代码
<meta name="viewport" content="width=device-width">

<script type="text/javascript">
alert(document.documentElement.clientWidth); //弹出600,正常情况应该弹出320
</script>

<meta name="viewport" content="width=600">

<script type="text/javascript">
alert(document.documentElement.clientWidth); //弹出320,正常情况应该弹出600
</script>
复制代码

测试的手机ideal viewport 宽度为320px,第一次弹出的值是600,但这个值应该是第行meta标签的结果啊,然后第二次弹出的值是320,这才是第一行meta标签所达到的效果啊,所以在安卓2.3(或许是所有2.x版本中)的自带浏览器中,对meta viewport标签进行覆盖或更改,会出现让人非常迷糊的结果。

 

七、结语

说了那么多废话,最后还是有必要总结一点有用的出来。

首先如果不设置meta viewport标签,那么移动设备上浏览器默认的宽度值为800px,980px,1024px等这些,总之是大于屏幕宽度的。这里的宽度所用的单位px都是指css中的px,它跟代表实际屏幕物理像素的px不是一回事。

第二、每个移动设备浏览器中都有一个理想的宽度,这个理想的宽度是指css中的宽度,跟设备的物理宽度没有关系,在css中,这个宽度就相当于100%的所代表的那个宽度。我们可以用meta标签把viewport的宽度设为那个理想的宽度,如果不知道这个设备的理想宽度是多少,那么用device-width这个特殊值就行了,同时initial-scale=1也有把viewport的宽度设为理想宽度的作用。所以,我们可以使用

<meta name="viewport" content="width=device-width, initial-scale=1">

来得到一个理想的viewport(也就是前面说的ideal viewport)。

为什么需要有理想的viewport呢?比如一个分辨率为320×480的手机理想viewport的宽度是320px,而另一个屏幕尺寸相同但分辨率为640×960的手机的理想viewport宽度也是为320px,那为什么分辨率大的这个手机的理想宽度要跟分辨率小的那个手机的理想宽度一样呢?这是因为,只有这样才能保证同样的网站在不同分辨率的设备上看起来都是一样或差不多的。实际上,现在市面上虽然有那么多不同种类不同品牌不同分辨率的手机,但它们的理想viewport宽度归纳起来无非也就 320、360、384、400等几种,都是非常接近的,理想宽度的相近也就意味着我们针对某个设备的理想viewport而做出的网站,在其他设备上的表现也不会相差非常多甚至是表现一样的。

Docker学习系列(一):windows下安装docker - tina的博客 - 博客频道 - CSDN.NET

mikel阅读(1100)

本文目录如下:


windows下安装docker的方法应该参考Docker官网,之前参考的是网上其他人翻译的博客,出了一些问题,后来发现,是由于docker更新速度较快,安装官网的方法最为妥当!

下面引用Docker 中文指南中的几个提示:

提示1:Docker 已经在windows7.1和windows 8上通过测试,当然它也可以在低版本的windows上使用。但是你的处理器必须支持硬件虚拟化。

提示2:Docker 引擎使用的是Linux内核特性,所以我们需要在 Windows 上使用一个轻量级的虚拟机 (VM) 来运行 Docker。我们使用 Windows的Docker客户端来控制 Docker 虚拟化引擎的构建、运行和管理 。

提示3:为了简化这个过程,我们设计了一个叫 Boot2Docker 的应用程序,你可以通过它来安装虚拟机和运行 Docker。

提示4:虽然你使用的是 Windows 的 Docker 客户端,但是 docker 引擎容器依然是运行在 Linux 宿主主机上(现在是通过Virtual box)。直到我们开发了 windows 版本的 Docker 引擎,你只需要在你的 Windows 主机上启动一个 Linux 容器。


参考Install Docker for Windows,即按照该网站的步骤一步步按照即可,该网站的教程非常详细

1.windows按照docker的基本要求

(1)64为操作系统,win7或者更高
(2)支持“ Hardware Virtualization Technology”,并且,“virtualization ”可用

2.具体安装步骤

即安装Docker Toolbox,同时还附加安装

  • Docker Client for Windows
  • Docker Toolbox management tool and ISO
  • Oracle VM VirtualBox
  • Git MSYS-git UNIX tools
    不用担心,下载的Docker Toolbox已经完全包含了这几个软件,直接安装就可以了

1.进入Docker Toolbox的下载网页,选择windows版本下载
这里写图片描述
2. 下载完成后,双击安装文件
3. 一路Next,接受所有默认安装
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

注意:在安装过程中,会出现几个其他的安装过程,如Ocracle Corporation等系列软件,全部选择安装即可,下面是几个小例子:
这里写图片描述
这里写图片描述
另外,如果你安装了360,它可能会阻止程序的安装,应该注意允许程序安装
这里写图片描述
4. 最后Finish
这里写图片描述
5. 整个安装过程非常简单,安装完成后,可以在桌面得到如下的三个图标:
这里写图片描述

3.开始使用

1.点击Docker Quickstart Terminal图标,从而打开一个Docker Toolbox terminal
这里写图片描述
– 打开terminal后,terminal会自动进行一些设置,需要点时间,全部完成后,会出现如下的结果
这里写图片描述
3.在$后输入各种docker命令就可以使用docker了
注:不需要像ubuntu中那样使用sudo!
例如:
(1)查看docker的版本信息

docker info
  • 1
  • 1

这里写图片描述
(2)登陆docker Hub的账号

docker login
  • 1
  • 1

然后,输入用户名和密码,例如
这里写图片描述
个人觉得:在使用docker时,是否登陆没有特别大的影响,只不过是,如果登陆了,就可以向docker hub上push自己的镜像了

4.安装远程连接工具连接docker

按照上面方法打开Docker Toolbox terminal后,发现在该终端中,无法进行复制、粘贴等操作,使用起来非常不方便,所以,这里参考zistxym的博文,安装远程连接工具SecureCRT

  • 下载SecureCRT
    地址:绿盟SecureCRT绿色版免安装,不知道为什么,有时这两个链接提示有病毒,所以,再提供一个百度云盘的链接,提取码:rm3g
  • 运行SecureCRT
    这里写图片描述
  • 连接docker
    这里写图片描述
    这里写图片描述
    注:默认的用户名和密码是: docker/tcuser
  • 使用SecureCRT即与使用Docker Quickstart Terminal的作用相同
    这里写图片描述
    这里写图片描述

    • 再使用SecureCRT连接docker时,必须要先启动Docker Quickstart Terminal
  • 关于SecureCRT的几点设置
    (1)使用中发现,secureCRT的鼠标右键功能默认是粘贴的功能,用起来和windows系统的风格不一致,如果要改为右键为弹出文本操作菜单功能,方便对选择的内容做拷贝编辑操作,可以在options菜单—-》global options——》terminal——-》mouse功能块处将paste on处改为:right button
    这里写图片描述
    此时,再鼠标右键时,弹出了文本操作功能的菜单,如下:
    这里写图片描述
    (2)更改secureCRT的字体和背景
    这里写图片描述
    这里写图片描述
    仅是更改当前section的字体
    这里写图片描述

5.安装中遇到的问题

全部安装完成后,打开Docker Quickstart Terminal,可能会出现如下错误:
这里写图片描述
这是因为电脑没有开启支持VT-X/AMD-v功能,即没有开启虚拟化技术,需要重启电脑,去BIOS里开启该功能

在利用image生成镜像时,发生了如下错误

flag provided but not defined:

以为是因为docekr service和client的版本不同,各种查询折腾,也没有成功,最后发现,居然是命令中-v和路径之间少了空格!都怪自己没有仔细查看错误提醒
这里写图片描述
~~~~~~~~~~
这里写图片描述

6.Docker的更新

如果本机安装的docker过期了,也就是有新版本的docker发布时,应该对本机的docker进行更新,否则很可能会影响它的继续使用,那么,对本机的docker进行更新可以安装下述方式:
(1)打开Docker Quickstart Terminal终端
(2)输入命令:docker-machine upgrade default
会开始自动更新本机的docker,如下图所示
这里写图片描述
(3)查看docker版本

docker version
  • 1
  • 1

这里写图片描述

这里写图片描述

7.Docker中的jupyter

我使用的image中带有jupyter,但发现按照ubuntu下的使用方法,即进入容器后,打开http://0.0.0.0:8888/无法打开Jupyter,经过一番查询才终于找到正解,原来jupyter的image中就有明确说明,但没有想到去那里查询!

具体方法:
(1)打开boot2docker,输入docker-machine ip,会返回一个IP地址,例如

$ docker-machine ip myjupytermachine
192.168.99.104

(2)在浏览器中打开http://192.168.99.104:8888,即可打开jupyter
而不是与ubuntu中一样的http://localhost:8888 (http://0.0.0.0:8888/)

8.windows下使用docker的常用命令

详细内容与ubuntu下的使用方法类似,见Docker学习系列(三):Ubuntu下使用Docker的基本指令记录及一些注意事项,但为了查阅方便,这里再单独列举

  • 查看本机images
docker images
  • 1
  • 1
  • 查看本机运行的container
docker ps
  • 1
  • 1
  • 从dockerhub上pull 镜像
docker pull 镜像名称
  • 1
  • 1
  • 利用image运行container:
docker run -it --rm -p 8888:8888 -v /c/Users/tingting/dropbox/code:/root/opt/workspace -v /c/Users/tingting/dropbox/data:/root/data tingtinglu/caffe_mxnet
  • 1
  • 1

(1)利用参数 -v
(2)冒号前为宿主机目录,必须为绝对路径
/c/Users/tingting/dropbox/code:
本机的C:\Users\tingting\dropbox\code文件夹
/c/Users/tingting/dropbox/data
本机的C:\Users\tingting\dropbox\data文件夹
(3)冒号后为镜像内挂载的路径
/root/opt/workspace
docker中的文件夹/root/opt/workspace
/root/data
docker中的文件夹/root/data
(4)这里的本机文件夹为c盘,那么,能否为d盘呢?
测试:

docker run -it --rm -p 8888:8888 -v /d/Dropbox/code:/root /opt/workspace -v /d/Dropbox/data:/root/data tingtinglu/caffe_mxnet
  • 1
  • 1

发现并不可行!这是因为目前,windows下只支持c盘下的文件夹映射

关于网狐棋牌的数据库 - 帘卷西风的专栏 - 博客频道 - CSDN.NET

mikel阅读(1026)

前不久放出了我自己

来源: 关于网狐棋牌的数据库 – 帘卷西风的专栏 – 博客频道 – CSDN.NET

前不久放出了我自己整理的网狐棋牌的源码,下载的网友反应都不错,只是不少同学都找我要数据库,最近一直没时间,今天趁放假的时间把数据库放出来,分享给大家。

关于网狐棋牌6603源码的整理、编译和搭建

数据库是我从网上下载,然后自己整理的,网狐的数据库存储过程原来是加密了的,我解密之后把数据库导出成了SQL文件,大家下载之后直接导入SQL文件即可。

数据库我使用使用SQL SERVER2005和2008都能架设成功。

关于数据库内容,我大致说一下,GameUserDB、ServerInfoDB、ServerInfoDataDB、ThreasureDB是框架级别的数据库,GameDataDB是游戏数据库,每个游戏的数据库结构是一样的,大家创建一个游戏,就导入一个该数据库即可。

大家在架设的过程中如果有问题可以咨询我。最后给出数据库文件的下载地址。

网狐棋牌数据库整理文件