当前位置:  编程技术>移动开发
本页文章导读:
    ▪[转]不同控制器其间通信的一个好方法        [转]不同控制器之间通信的一个好方法 首页在view1的控制器初始化init方法里加上观察者模式方法:[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(reloadChat:)name:@”reloadChat” object:nil];.........
    ▪ 异常:bitmap size exceeds VM budget        错误:bitmap size exceeds VM budget   private Bitmap decodeFile(File f){ Bitmap b = null; try { //Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapF.........
    ▪ 兑现屏幕下方展示的TAB分页       实现屏幕下方展示的TAB分页 这篇博客是参考helloandroid兄的腾讯微博应用,我整理了一下。完整项目的介绍请在http://helloandroid.iteye.com/看 首先是效果图: 我把helloandroid兄的源代码整理了一.........

[1][转]不同控制器其间通信的一个好方法
    来源: 互联网  发布时间: 2014-02-18
[转]不同控制器之间通信的一个好方法
首页在view1的控制器初始化init方法里加上观察者模式方法:

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reloadChat:)
name:@”reloadChat” object:nil];

-(void)reloadChat:(id)sender{}

在view2里的button添加用来触发view1的reloadChat方法:

[[NSNotificationCenter defaultCenter] postNotificationName:@”reloadChat” object:self];

—END—

原文: http://sue602.blog.163.com/blog/static/314953072010102423136387/

    
[2] 异常:bitmap size exceeds VM budget
    来源: 互联网  发布时间: 2014-02-18
错误:bitmap size exceeds VM budget

 

private Bitmap decodeFile(File f){
    Bitmap b = null;
    try {
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f), null, o);
        int scale = 1;
        if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
            scale = Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
        }

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        b = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {
    }
    return b;
}
 

 

转自http://www.cnblogs.com/RayLee/archive/2010/11/09/1872856.html

 

BitmapFactory.decodeFile(imageFile);

用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。

BitmapFactory.Options.inSampleSize

设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。inSampleSize的具体含义请参考SDK文档。例如:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

 

 

设置恰当的inSampleSize是解决该问题的关键之一。BitmapFactory.Options提供了另一个成员inJustDecodeBounds。

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);
 

设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即opts.width和opts.height。有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。

查看Android源码,Android提供了一种动态计算的方法。

public static int computeSampleSize(BitmapFactory.Options options,
int minSideLength, int maxNumOfPixels) {
int initialSize = computeInitialSampleSize(options, minSideLength,
maxNumOfPixels);

int roundedSize;
if (initialSize <= 8) {
roundedSize = 1;
while (roundedSize < initialSize) {
roundedSize <<= 1;
}
} else {
roundedSize = (initialSize + 7) / 8 * 8;
}

return roundedSize;
}

private static int computeInitialSampleSize(BitmapFactory.Options options,
int minSideLength, int maxNumOfPixels) {
double w = options.outWidth;
double h = options.outHeight;

int lowerBound = (maxNumOfPixels == -1) ? 1 :
(int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == -1) ? 128 :
(int) Math.min(Math.floor(w / minSideLength),
Math.floor(h / minSideLength));

if (upperBound < lowerBound) {
// return the larger one when there is no overlapping zone.
return lowerBound;
}

if ((maxNumOfPixels == -1) &&
(minSideLength == -1)) {
return 1;
} else if (minSideLength == -1) {
return lowerBound;
} else {
return upperBound;
}
}	
使用该算法,就可动态计算出图片的inSampleSize。
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageFile, opts);

opts.inSampleSize = computeSampleSize(opts, -1, 128*128);	
opts.inJustDecodeBounds = false;
try {
Bitmap bmp = BitmapFactory.decodeFile(imageFile, opts);
imageView.setImageBitmap(bmp);
} catch (OutOfMemoryError err) {
}

另外,可以通过Bitmap.recycle()方法来释放位图所占的空间,当然前提是位图没有被使用。

 


    
[3] 兑现屏幕下方展示的TAB分页
    来源: 互联网  发布时间: 2014-02-18
实现屏幕下方展示的TAB分页
这篇博客是参考helloandroid兄的腾讯微博应用,我整理了一下。完整项目的介绍请在http://helloandroid.iteye.com/看

首先是效果图:


我把helloandroid兄的源代码整理了一下,并梳理了涉及到的知识点,总结如下:

1、TabActivity的使用
Java代码 
public class MainActivity extends TabActivity { 
 
    private TabHost tabHost; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        tabHost = getTabHost(); 
        populateTab(); 
 
    } 
 
    /**
     * 组装tab控件
     */ 
    private void populateTab() { 
 
        Resources res = getResources(); 
 
        populateTabItem(R.drawable.tab_home_selector, 
                res.getString(R.string.tab_home), new Intent(this, 
                        HomeActivity.class)); 
        populateTabItem(R.drawable.tab_atme_selector, 
                res.getString(R.string.tab_refer), new Intent(this, 
                        ReferActivity.class)); 
        populateTabItem(R.drawable.tab_message_selector, 
                res.getString(R.string.tab_secret), new Intent(this, 
                        MessageActivity.class)); 
        populateTabItem(R.drawable.tab_explore_selector, 
                res.getString(R.string.tab_search), new Intent(this, 
                        SearchActivity.class)); 
        populateTabItem(R.drawable.tab_focus_selector, 
                res.getString(R.string.tab_attention), new Intent(this, 
                        AttentionActivity.class)); 
 
    } 
 
    /**
     * 生成tab_item
     * 
     * @param imageResourceSelector
     *            图片选择器
     * @param text
     *            文本
     * @param intent
     *            intent
     */ 
    private void populateTabItem(int imageResourceSelector, String text, 
            Intent intent) { 
 
        View view = View.inflate(this, R.layout.tab_item, null);// 拼装view 
        ((ImageView) view.findViewById(R.id.tab_item_imageview)) 
                .setImageResource(imageResourceSelector); 
        ((TextView) view.findViewById(R.id.tab_item_textview)).setText(text); 
 
        TabSpec spec = tabHost.newTabSpec(text).setIndicator(view) 
                .setContent(intent);// 将view注入spec 
        tabHost.addTab(spec); 
 
    } 
 


Xml代码 
<?xml version="1.0" encoding="UTF-8"?> 
 
<TabHost android:id="@android:id/tabhost" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> 
 
    <RelativeLayout android:orientation="vertical" 
        android:layout_width="fill_parent" android:layout_height="fill_parent"> 
 
        <include android:id="@+id/head_line" layout="@layout/head_line" 
            android:layout_width="fill_parent" android:layout_height="wrap_content" /> 
 
        <FrameLayout android:id="@android:id/tabcontent" 
            android:layout_below="@id/head_line" android:layout_width="fill_parent" 
            android:layout_height="fill_parent" android:layout_weight="1.0" /> 
 
        <TabWidget android:id="@android:id/tabs" android:background="@drawable/tab_bkg" 
            android:layout_gravity="bottom" android:layout_height="60.0dip" 
            android:layout_width="fill_parent" android:fadingEdge="none" 
            android:fadingEdgeLength="0.0px" android:paddingLeft="0.0dip" 
            android:paddingTop="2.0dip" android:paddingRight="0.0dip" 
            android:paddingBottom="0.0dip" android:layout_alignParentBottom="true" 
            android:layout_alignParentTop="false" /> 
 
    </RelativeLayout> 
 
</TabHost> 

可以看到,TabActivity是继承自Activity,包含了一个TabHost组件。TabHost组件则是继承自FrameLayout的ViewGroup。

TabHost组件本身的id必须是@android:id/tabhost,它必须包含一个FrameLayout,并且该FrameLayout的id必须是@android:id/tabcontent,此外还要包含一个TabWidget,id是@android:id/tabs。

FrameLayout可以放置每个单独的Activity,而TabWidget则是每个Tab页签。默认第一个页签对应的Activity,会首先显示在FrameLayout里。然后每次点击其他的Tab页签,对应的Activity就会切换显示到FrameLayout里。这个有点类似html中的frameset的概念

2、在main.xml中有一行
Xml代码 
<include android:id="@+id/head_line" layout="@layout/head_line" 
            android:layout_width="fill_parent" android:layout_height="wrap_content" /> 

作用是引入另一个View文件,head_line.xml
Xml代码 
<RelativeLayout android:background="@drawable/header" 
    android:layout_width="fill_parent" android:layout_height="wrap_content" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
 
    <Button android:id="@+id/top_btn_left" android:textColor="@color/button_text_selector" 
        android:background="@drawable/top_refresh_selector" 
        android:layout_width="wrap_content" android:layout_height="wrap_content" 
        android:layout_marginLeft="12.0dip" android:layout_alignParentLeft="true" 
        android:layout_centerVertical="true" /> 
 
    <Button android:id="@+id/top_btn_right" android:textColor="@color/button_text_selector" 
        android:background="@drawable/top_edit_selector" android:layout_width="wrap_content" 
        android:layout_height="wrap_content" android:layout_marginRight="12.0dip" 
        android:layout_alignParentRight="true" android:layout_centerVertical="true" /> 
 
    <TextView android:id="@+id/top_title" android:textSize="22.0sp" 
        android:textColor="@color/head_line_text" android:ellipsize="middle" 
        android:gravity="center_horizontal" android:layout_width="wrap_content" 
        android:layout_height="wrap_content" android:text="@string/user_name" 
        android:singleLine="true" android:layout_toLeftOf="@id/top_btn_right" 
        android:layout_toRightOf="@id/top_btn_left" 
        android:layout_centerInParent="true" 
        android:layout_alignWithParentIfMissing="true" /> 
 
</RelativeLayout> 

用这种方式可以实现View组件的复用,是很方便的,可以学习一下这种方式。把要复用的View写在单独的xml文件里,然后在其他需要的地方,只要直接include就可以了

3、每个Tab页签对应的View是tab_item.xml
Xml代码 
<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout android:orientation="vertical" 
    android:layout_width="fill_parent" android:layout_height="wrap_content" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
 
    <ImageView android:id="@+id/tab_item_imageview" 
        android:layout_width="fill_parent" android:layout_height="32.0dip" 
        android:scaleType="fitCenter" /> 
 
    <TextView android:id="@+id/tab_item_textview" 
        android:layout_width="fill_parent" android:layout_height="wrap_content" 
        android:gravity="center" android:singleLine="true" 
        android:marqueeRepeatLimit="1" android:textSize="11.0sp" 
        android:ellipsize="marquee" /> 
 
</LinearLayout> 

然后在java代码中进行组装
Java代码 
View view = View.inflate(this, R.layout.tab_item, null);// 拼装view 
        ((ImageView) view.findViewById(R.id.tab_item_imageview)) 
                .setImageResource(imageResourceSelector); 
        ((TextView) view.findViewById(R.id.tab_item_textview)).setText(text); 
 
        TabSpec spec = tabHost.newTabSpec(text).setIndicator(view) 
                .setContent(intent);// 将view注入spec 
        tabHost.addTab(spec); 

这部分的详细说明,可以看google提供的API

4、然后这个页面中用到了selector的概念,即当要动态改变某些组件的属性,如颜色,字体大小等,可以用selector来进行动态选择,这里有点类似CSS中的伪类的概念
Xml代码 
android:textColor="@color/button_text_selector" 

Xml代码 
<?xml version="1.0" encoding="UTF-8"?> 
 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
 
    <item android:state_pressed="true" android:color="@color/button_text_pressed" /> 
 
    <item android:state_selected="true" android:color="@color/button_text_pressed" /> 
 
    <item android:color="@color/button_text_normal" /> 
 
</selector> 

上面代码的意思是,根据按钮控件是否按下,是否选择,在运行时动态决定颜色。通过同样的方式,还可以动态决定一个按钮的图片
Xml代码 
<selector 
  xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/top_edit_normal" /> 
    <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/top_edit_press" /> 
    <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/top_edit_normal" /> 
    <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/top_edit_press" /> 
    <item android:state_pressed="true" android:drawable="@drawable/top_edit_press" /> 
</selector> 

5、这个页面还用到了一个比较特殊的技巧,就是通过xml,而不是静态图片来绘制背景
Xml代码 
<RelativeLayout android:background="@drawable/header" 
    android:layout_width="fill_parent" android:layout_height="wrap_content" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

上面代码中的android:background="@drawable/header",指向drawable文件夹中的header.xml
Xml代码 
<?xml version="1.0" encoding="UTF-8"?> 
 
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android"> 
 
    <gradient android:startColor="#ff6c7078" android:endColor="#ffa6abb5" 
        android:angle="270.0" android:type="linear" /> 
 
</shape> 

可以看到,这个控件的背景色,是用xml绘制出来的。不过这个技巧我在别的地方见的比较少,感觉比较冷门

关于TabHost组件的知识点,就简单介绍这些。详细的内容,请到helloandroid.iteye.com里看

    
最新技术文章:
▪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