Android 底部切换

来源:互联网 发布:软件系统接口设计方案 编辑:程序博客网 时间:2024/06/06 03:04
 底部跳转  刚看了一个开源的软件 ,人家仿的京东商城 , 底部的tab切换时用的         <RadioGroup
            android:id="@+id/home_radio_button_group"
            android:layout_width="match_parent"
            android:layout_height="55dp"
            android:layout_gravity="bottom"
            android:background="@drawable/main_navigation_background"
            android:gravity="center_vertical"
            android:orientation="horizontal" >

            <RadioButton
                android:id="@+id/home_tab_main"
                style="@style/home_tab_bottom"
                android:background="@drawable/home_tab_background_selector"
                android:checked="true"
                android:drawableTop="@drawable/home_tab_main_selector" />

            <RadioButton
                android:id="@+id/home_tab_search"
                style="@style/home_tab_bottom"
                android:background="@drawable/home_tab_background_selector"
                android:drawableTop="@drawable/home_tab_search_selector" />

            <RadioButton
                android:id="@+id/home_tab_category"
                style="@style/home_tab_bottom"
                android:background="@drawable/home_tab_background_selector"
                android:drawableTop="@drawable/home_tab_category_selector" />

            <RadioButton
                android:id="@+id/home_tab_cart"
                style="@style/home_tab_bottom"
                android:background="@drawable/home_tab_background_selector"
                android:drawableTop="@drawable/home_tab_cart_selector" />

            <RadioButton
                android:id="@+id/home_tab_personal"
                style="@style/home_tab_bottom"
                android:background="@drawable/home_tab_background_selector"
                android:drawableTop="@drawable/home_tab_personal_selector" />

        </RadioGroup>


这还是首次看见 , 当年那个viewpager顶部的切换的时候 和这个的原理差不多,以后可以试试 ,这个主要是底部的那个滑动按钮的切换 比较好实现,当然网上还有其他的开源库,比这个可能实现的好 ,但是知道一种方法 就是 get了,这种底部tab的切换实现的方法 很多 ,自己可以写个布局 ,什么的都是可以实现的 ,但是这种方法感觉比较巧 。当然 其中个地方比较难搞,就是 ,假如是购物车的话 肯定有购物车上有个什么数字的 ,这个可能有点坑了。不过可以重写radiobutton控件 。


当然这里有个管理activity的工具类也可以 了解下 ,package com.itau.jingdong;

import java.util.Stack;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;

/**
 * @author Tau.Chen 陈涛
 *
 * @email tauchen1990@gmail.com,1076559197@qq.com
 *
 * @date 2013年9月12日
 *
 * @version V_1.0.0
 *
 * @description 应用程序Activity的管理类
 *
 */
public class AppManager {
    private static Stack<Activity> mActivityStack;
    private static AppManager mAppManager;

    private AppManager() {
    }

    /**
     * 单一实例
     */
    public static AppManager getInstance() {
        if (mAppManager == null) {
            mAppManager = new AppManager();
        }
        return mAppManager;
    }

    /**
     * 添加Activity到堆栈
     */
    public void addActivity(Activity activity) {
        if (mActivityStack == null) {
            mActivityStack = new Stack<Activity>();
        }
        mActivityStack.add(activity);
    }

    /**
     * 获取栈顶Activity(堆栈中最后一个压入的)
     */
    public Activity getTopActivity() {
        Activity activity = mActivityStack.lastElement();
        return activity;
    }

    /**
     * 结束栈顶Activity(堆栈中最后一个压入的)
     */
    public void killTopActivity() {
        Activity activity = mActivityStack.lastElement();
        killActivity(activity);
    }

    /**
     * 结束指定的Activity
     */
    public void killActivity(Activity activity) {
        if (activity != null) {
            mActivityStack.remove(activity);
            activity.finish();
            activity = null;
        }
    }

    /**
     * 结束指定类名的Activity
     */
    public void killActivity(Class<?> cls) {
        for (Activity activity : mActivityStack) {
            if (activity.getClass().equals(cls)) {
                killActivity(activity);
            }
        }
    }

    /**
     * 结束所有Activity
     */
    public void killAllActivity() {
        for (int i = 0, size = mActivityStack.size(); i < size; i++) {
            if (null != mActivityStack.get(i)) {
                mActivityStack.get(i).finish();
            }
        }
        mActivityStack.clear();
    }

    /**
     * 退出应用程序
     */
    public void AppExit(Context context) {
        try {
            killAllActivity();
            ActivityManager activityMgr = (ActivityManager) context
                    .getSystemService(Context.ACTIVITY_SERVICE);
            activityMgr.restartPackage(context.getPackageName());
            System.exit(0);
        } catch (Exception e) {
        }
    }
}

当然 里面还有比较好的imageloader的介绍


    /**
     * 返回默认的参数配置
     *
     * @param isDefaultShow
     *            true:显示默认的加载图片 false:不显示默认的加载图片
     * @return
     */
    public static DisplayImageOptions initDisplayOptions(boolean isShowDefault) {
        DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions.Builder();
        // 设置图片缩放方式
        // EXACTLY: 图像将完全按比例缩小的目标大小
        // EXACTLY_STRETCHED: 图片会缩放到目标大小
        // IN_SAMPLE_INT: 图像将被二次采样的整数倍
        // IN_SAMPLE_POWER_OF_2: 图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
        // NONE: 图片不会调整
        displayImageOptionsBuilder.imageScaleType(ImageScaleType.EXACTLY);
        if (isShowDefault) {
            // 默认显示的图片
            displayImageOptionsBuilder.showStubImage(R.drawable.no_image);
            // 地址为空的默认显示图片
            displayImageOptionsBuilder
                    .showImageForEmptyUri(R.drawable.no_image);
            // 加载失败的显示图片
            displayImageOptionsBuilder.showImageOnFail(R.drawable.no_image);
        }
        // 开启内存缓存
        displayImageOptionsBuilder.cacheInMemory(true);
        // 开启SDCard缓存
        displayImageOptionsBuilder.cacheOnDisc(true);
        // 设置图片的编码格式为RGB_565,此格式比ARGB_8888快
        displayImageOptionsBuilder.bitmapConfig(Bitmap.Config.RGB_565);

        return displayImageOptionsBuilder.build();
    }


    /**
     * 异步图片加载ImageLoader的初始化操作,在Application中调用此方法
     *
     * @param context
     *            上下文对象
     * @param cacheDisc
     *            图片缓存到SDCard的目录,只需要传入SDCard根目录下的子目录即可,默认会建立在SDcard的根目录下
     */
    public static void initImageLoader(Context context, String cacheDisc) {
        // 配置ImageLoader
        // 获取本地缓存的目录,该目录在SDCard的根目录下
        File cacheDir = StorageUtils.getOwnCacheDirectory(context, cacheDisc);
        // 实例化Builder
        ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(
                context);
        // 设置线程数量
        builder.threadPoolSize(3);
        // 设定线程等级比普通低一点
        builder.threadPriority(Thread.NORM_PRIORITY);
        // 设定内存缓存为弱缓存
        builder.memoryCache(new WeakMemoryCache());
        // 设定内存图片缓存大小限制,不设置默认为屏幕的宽高
        builder.memoryCacheExtraOptions(480, 800);
        // 设定只保存同一尺寸的图片在内存
        builder.denyCacheImageMultipleSizesInMemory();
        // 设定缓存的SDcard目录,UnlimitDiscCache速度最快
        builder.discCache(new UnlimitedDiscCache(cacheDir));
        // 设定缓存到SDCard目录的文件命名
        builder.discCacheFileNameGenerator(new HashCodeFileNameGenerator());
        // 设定网络连接超时 timeout: 10s 读取网络连接超时read timeout: 60s
        builder.imageDownloader(new BaseImageDownloader(context, 10000, 60000));
        // 设置ImageLoader的配置参数
        builder.defaultDisplayImageOptions(initDisplayOptions(true));

        // 初始化ImageLoader
        ImageLoader.getInstance().init(builder.build());
    }
里面还看到一个晃动动画

Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);
        translateAnimation.setInterpolator(new CycleInterpolator(counts));
        translateAnimation.setDuration(1000);

        return translateAnimation;

counts 是设置晃动的次数,不过作者没有用 其他的东西 后面再看 ,提交源码



0 0
原创粉丝点击