大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Android技巧 > Android浮动组件开发实例

Android浮动组件开发实例(2)

关键词:Android浮动组件开发实例  阅读(1262) 赞(15)

[摘要]本文是对Android浮动组件开发实例的讲解,对学习Android编程技术有所帮助,与大家分享。

这个函数的功能就是让文本显示在targetView的下方的横向中间的位置,也就是文本的背景尖角三角要指向targetView横向中间的位置,这样才好看些。为了这个才需要使用Paint测量文本的宽度,所以这也是该组件的一个缺陷,不能显示String格式之外的字符,比如SpannableString。

完整的组件代码

上面是对组件代码的拆分讲解,是为了说明我们当时实现这个组件的想法以及步骤,下面就整体把代码列出来,明了的看一下。

public class MyToast {
    private static final int WHAT_SHOW = 1;
    private View targetView = null;// 目标view
    private Context context = null;// Toast的上下文
    private Toast toast = null;// 显示的土司
    private String content = null;// 土司显示内容
    private TextView textView = null;// 土司中的textview
    private int time = 0;// 土司显示时间
    private HandlerThread handlerThread = null;// handlerThread
    private static MyToast myToast = null;
    private Handler handler = null;

    /**
     * 私有的构造函数
     * 
     * @param context
     *            上下文
     * @param targetView
     *            目标view
     * @param content
     *            内容
     * @param time
     *            显示时间
     */
    private MyToast(Context context, View targetView, String content, int time) {
        this.targetView = targetView;
        this.context = context;
        this.content = content;
        this.time = time;
        // 初始化Toast
        toast = new Toast(this.context);
        textView = new TextView(this.context);
        textView.setTextColor(Color.BLACK);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
        textView.setBackgroundResource(R.drawable.float_text_toast_bg);
        textView.setText(this.content);
        toast.setView(textView);// 设置背景
        
        toast.setDuration(time);// 设置时间
        // 开始handlerthread
        handlerThread = new HandlerThread("MyToast");
        handlerThread.start();
        // 构造一个自己的looper
        handler = new MyHandler(handlerThread.getLooper());
    }

    /**
     * 显示Toast
     * 
     * @param context
     *            上下文
     * @param targetView
     *            目标view
     * @param content
     *            内容
     * @param time
     *            显示时间
     */
    public static MyToast makeText(Context context, View targetView,
            String content, int time) {
        myToast = new MyToast(context, targetView, content, time);
        return myToast;

    }

    public void show() {
        handler.sendEmptyMessage(WHAT_SHOW);
    }

    /**
     * 计算获取浮动文本显示的位置,把浮动文本放在targetView的中心处
     * 
     * @param targetPos
     * @return 一个包含top和left的Rect
     */
    private Rect getSize(int[] targetPos) {
        final Rect windowVisibleRect = new Rect();
        final View targetView = this.targetView;
        final TextView contentView = textView;
        // 状态栏高度
        targetView.getWindowVisibleDisplayFrame(windowVisibleRect);
        int statusBarHeight = windowVisibleRect.top;
        // 背景图那个三角箭头的位置
        final TextPaint textPaint = contentView.getPaint();
        int contentW = (int) textPaint.measureText((String) contentView
                .getText());
        int arrowPos = (int) (contentW * (30.0 / 160));

        final Rect rect = new Rect();
        rect.left = targetPos[0] + targetView.getWidth() / 2 - arrowPos;
        rect.top = targetPos[1] - statusBarHeight + targetView.getHeight();
        return rect;
    }
    /**
     * Handler调用的show方法,主要为了等待targetView的位置
     * 如果targetView的位置没有得到,handler looper继续循环获取
     */
    private void showInHandler() {
        int[] targetPos = getTargetViewPos();
        if(targetPos[0]==0&&targetPos[1]==0){
            handler.sendEmptyMessageDelayed(WHAT_SHOW, 100);
        }else{
            final Rect contentPos=getSize(targetPos);
            toast.setGravity(Gravity.LEFT|Gravity.TOP, contentPos.left, contentPos.top);
            toast.show();
        }
    }
    /**
     * 得到目标View的位置
     * @return
     */
    private int[] getTargetViewPos() {
        final int[] targetPos = new int[2];
        targetView.getLocationInWindow(targetPos);
        return targetPos;
    }

    /**
     * 自定义的Handler
     * 
     * @author sansung
     * 
     */
    class MyHandler extends Handler {

        public MyHandler(Looper looper) {
            super(looper);
            // TODO 自动生成的构造函数存根
        }

        @Override
        public void handleMessage(Message msg) {
            // TODO 自动生成的方法存根
            super.handleMessage(msg);
            switch (msg.what) {
            case WHAT_SHOW:
                showInHandler();
                break;
            default:
                break;
            }
        }

    }

}

此组件和Toast的实现方法一样,所以上手不难,只需使用makeText静态方法生成一个即可

MyToast.makeText(MainActivity.this, v, "12222222222222221111111111", 1).show();

1

源代码:http://pan.baidu.com/s/1dD1Qx01

«上一页12下一页»

相关Android技巧推荐

    暂时没有相关推荐



    相关评论