当前位置:  编程技术>移动开发
本页文章导读:
    ▪开发中关于Fragment错误的两个有关问题        开发中关于Fragment异常的两个问题 下边两个问题,是在开发中碰到的一些关于Fragment的偶发性的问题,今天时间比较多,就在网上搜了一些解决方式: 1、关于Fragment(XXFragment) not attached to A.........
    ▪ 在Meego下实现一个播放器——QtGstreamer        在Meego上实现一个播放器——QtGstreamer 在Meego上实现一个播放器——QtGstreamer 网络上关于QtGstreamer的教程不多,所以只好从源码入手。这是我自己总结的一个小方法,一般使用这些开源的库,.........
    ▪ dpi 、 dip 、分辨率、银幕尺寸、px、density 关系以及换算(终结版)       dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算(终结版) 首先,说下概念(网上很多帖子几个地方都搞混了,理一下): dip : device independent pixels ,设备无关像素。 我看很多.........

[1]开发中关于Fragment错误的两个有关问题
    来源: 互联网  发布时间: 2014-02-18
开发中关于Fragment异常的两个问题
下边两个问题,是在开发中碰到的一些关于Fragment的偶发性的问题,今天时间比较多,就在网上搜了一些解决方式: 1、关于Fragment(XXFragment) not attached to Activity 异常。出现该异常,是因为Fragment的还没有Attach到Activity时,调用了如getResource()等,需要上下文Content的函数。解决方法,就是等将调用的代码写在OnStart()中。网上还有几处这样的参考:http://stackoverflow.com/questions/10919240/fragment-myfragment-not-attached-to-activity  回答的主要是在调用
getResources().getString(R.string.app_name);
之前增加一个判断isAdded(),两外说这个异常解决办法的有 http://stackoverflow.com/questions/6870325/android-compatibility-package-fragment-not-attached-to-activity
这个是针对另外一种情况下的解决方式。
2、在使用Fragment保存参数的时候,可能是因为需要保存的参数比较大或者比较多,这种情况下页会引起异常。比如代码
		Bundle b = new Bundle();
		b.putParcelable("bitmap", bitmap2);
		imageRecognitionFragment.setArguments(b);
设置好参数,并且添加hide(),add(),方法之后,需要commit(),来实现两个Fragment跳转的时候,这种情形下参数需要进行系统保存,但是这个时候你已经实现了跳转,系统参数却没有保存。此时就会报
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
异常。分析原因:你并不需要系统保存的参数,只要你自己设置的参数能够传递过去,在另外一个Fragment里能够顺利接受就行了,现在android里提供了另外一种形式的提交方式commitAllowingStateLoss(),从名字上就能看出,这种提交是允许状态值丢失的。到此问题得到完美解决,值的传递是你自己控制的。
这里也说一下另外一个问题,bitmap 也可以通过Bundle传递的,使用putParacelable就可以了










    
[2] 在Meego下实现一个播放器——QtGstreamer
    来源: 互联网  发布时间: 2014-02-18
在Meego上实现一个播放器——QtGstreamer
在Meego上实现一个播放器——QtGstreamer
网络上关于QtGstreamer的教程不多,所以只好从源码入手。这是我自己总结的一个小方法,一般使用这些开源的库,如果没有大公司做维护支持,常常会发现文档写的不完备。有时候甚至连最基本的API都找不到。然而在它的源码包中常常会有一个名为test或example的文件夹,里面会有一些非常简单的例子。例子的代码一般较为短小精炼,只要读懂了这个例子,就能够明白主要API的含义了。


先用zypper在meego上装好QtGstreamer(注意要更新到meego1.2版本,之前的版本没有收录QtGstreamer)。查看其版本信息,为0.10.1-1.70。在Gstreamer官网上找到对应的版本的源码(或者直接用yumdownloader下载源中的源码,但是有可能不完整),下载解压。之所以要找同样版本号的原因是防止Gstreamer在更新中有API的变更。


如预期在源码中找到一个名为player的例子与一个recoder的例子。阅读源码,编译,运行,感觉player已经基本可以满足我们的需求,由于其使用的是Gstreamer中的playbin2来搭建pipeline,所以对于格式的支持我们不用过多考虑。为了支持的完备,出了zypper自己带的Gstreamer plugin之外,需要自己把同等版本的ffmpeg plugin包以及ugly plugin包装上。方法也是先查看本机其他plugin的版本,再去Gstreamer官网找相应版本,下载,编译,安装。


从这个例子还可以看出来,使用QtGstreamer的方法很简单,首先聚合一个QGst::Ui::VideoWidget。这是一个QtWidget,可以作为普通的组件在Qt界面显示,另一方面,它可以绑定一个普通的sink,例如屏幕上的xvideosink,这样pipeline播放的结果就会显示在这个组件里,而不是其他的窗口。从官方文档(http://gstreamer.freedesktop.org/data/doc/gstreamer/head/qt-gstreamer/html/classQGst_1_1Ui_1_1VideoWidget.html)可以看到,绑定的方法有两种,

void 	setVideoSink (const ElementPtr &sink)
void 	watchPipeline (const PipelinePtr &pipeline)

对应的释放方法为:
void 	releaseVideoSink ()
void 	stopPipelineWatch ()
除了player这个例子之外还有一个叫做recorder的例子,界面过于简单,不能预览,使用不便,所以要重新写一个简单的recorder。recorder的pipeline自然不能用playbin2来搭建。在例子用到的pipeline是:
audiosrc ! audioconvert ! audioresample ! audiorate ! speexenc ! queue !
                                                                                                                                   oggmux ! filesink
autovideosrc ! ffmpegcolorspace ! theoraenc ! queue !
由于需要一个预览的功能,我们把做两种结构的pipeline,一个工作在预览状态,一个工作在录制状态,状态切换的时候改变pipeline的结构。
预览状态的pipeline为:
autovideosrc ! queue ! xvimagesink

录制的pipeline为:

                                   queue ! xvimagesink
autovideosrc ! tee !
                                   queue ! ffmpegcolorspace ! theoraenc ! oggmux ! filesink
可以看到没有录音了,对的,先不用管声音了。当然也可以加上。

player的源代码在QtGstreamer源码的例子里面会有,我们不改动。Recorder的源码贴在下面:

#include "recorder.h"
#include <QGst/ElementFactory>

Recorder::Recorder(QWidget *parent)
    : QGst::Ui::VideoWidget(parent)
{
    camera_src = QGst::ElementFactory::make("autovideosrc");
    tee = QGst::ElementFactory::make("tee");
    queue0 = QGst::ElementFactory::make("queue");
    queue1 = QGst::ElementFactory::make("queue");
    ffmpegcolorspace = QGst::ElementFactory::make("ffmpegcolorspace");
    theoraenc = QGst::ElementFactory::make("theoraenc");
    oggmux = QGst::ElementFactory::make("oggmux");
    filesink = QGst::ElementFactory::make("filesink");
    x_sink = QGst::ElementFactory::make("xvimagesink");

    m_pipeline = QGst::Pipeline::create();
    m_pipeline->add(camera_src, tee, queue0, x_sink, queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);

    camera_src->link(tee);
    QGst::Element::linkMany(tee, queue0, x_sink);
    QGst::Element::linkMany(tee, queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);
}

Recorder::~Recorder()
{
    if (m_pipeline) {
	m_pipeline->setState(QGst::StateNull);
	releaseVideoSink();
    }
}


void Recorder::preview()
{
    m_pipeline->setState(QGst::StateNull);
    releaseVideoSink();

    m_pipeline->remove(queue1);
    m_pipeline->remove(ffmpegcolorspace);
    m_pipeline->remove(theoraenc);
    m_pipeline->remove(oggmux);
    m_pipeline->remove(filesink);

    setVideoSink(x_sink);
    m_pipeline->setState(QGst::StatePlaying);
}

void Recorder::record(const QString &uri)
{
    m_pipeline->setState(QGst::StateNull);
    releaseVideoSink();
    filesink->setProperty("location", uri);

    m_pipeline->add(queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);

    //    camera_src->link(tee);
    //    QGst::Element::linkMany(tee, queue0, x_sink);
    QGst::Element::linkMany(tee, queue1, ffmpegcolorspace, theoraenc, oggmux, filesink);

    setVideoSink(x_sink);
    m_pipeline->setState(QGst::StatePlaying);
}


    
[3] dpi 、 dip 、分辨率、银幕尺寸、px、density 关系以及换算(终结版)
    来源: 互联网  发布时间: 2014-02-18
dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算(终结版)

首先,说下概念(网上很多帖子几个地方都搞混了,理一下):


dip : device independent pixels ,设备无关像素。 我看很多帖子写的五花八门的,关于d的,什么display啊各种都有,既然是设备无关,我还是觉得device靠谱。

   dp就是dip

px : 像素不多说


dpi :dots per inch , 直接来说就是一英寸多少个点。常见取值 120,160,240。我一般称作像素密度,简称密度

density : 直接翻译的话貌似叫 密度。常见取值 1.5 , 1.0 。


分辨率: 横纵2个方向的像素点的数量,常见取值 480X800 ,320X480

屏幕尺寸: 屏幕对角线的长度。电脑电视同理。

     这里还涉及另外一个问题,就是屏幕比例的问题。因为只确定了对角线长,2边长度还不一定。所以有了4:3、16:9这种,这样就可以算出屏幕边长了。


重点来了,网上很多帖子直接把 density 叫做“密度”,然后就说他是像素密度,然后就说他是dpi。

在android里面,获取一个窗口的metrics,里面有这么几个值

metrics.density;
metrics.densityDpi;


densityDpi就是我们常说的dpi。density其实是  DPI / (160像素/英寸)  后得到的值。是不是有点奇怪,因为我带了单位。。。这个涉及到后面一个比较重要的东西,后面再说。

从上面就看得出了,DPI本身的单位也是 像素/英寸,所以density其实是没单位的,他就是一个比例值。

而dpi的单位是 像素/英寸,比较符合物理上面的密度定义,密度不都是单位度量的值么,所以我更喜欢把dpi叫像素密度,简称密度,density还是就叫density。



然后,来算算dpi。

比如一个机器,屏幕4存,分辨率480X800,他的dpi能算么。

因为不知道边长,肯定不能分开算,4是对角线长度,那直接用勾股定理算对角线像素,除以4,算出来大概是 dpi = 233 像素/英寸。

那么density就是  (233 px/inch)/(160 px/inch)=1.46 左右


顺带说下,android默认的只有3个dpi,low、medium和high,对应 120、160、240,如果没有特别设置,所有的dpi都会被算成这3个,具体可以参考下这个帖子

http://android.tgbus.com/Android/tutorial/201103/347176.shtml

其中的default就是160。



然后就该算了,我们写布局的时候,肯定还是要知道1个dp到底有多少px的。

换算公式如下:    dp = (dip/(160像素/英寸))px  =  density px

        注意,这里都是带单位的。px是单位,dp是单位,density没单位。


为了方便,假设dip是240 像素/英寸 , 那么density就是1.5

那么就是   dp=1.5px ,注意这是带了单位的,也就是 设备无关像素 = density 像素


那么转换为数值计算的话,应该是下面这个式子

PX = density * DP

也就是 

像素值 = density * 设备无关像素值  ,请注意这里有个值字。

 


所以,90px 就应该是 60 dp 。不要问我为什么和公式不符了,全是单位的问题,物理老师死得早啊 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3