Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 951|回复: 0

[实例教程]仿Android QQ实现的QQ顶栏椭圆透明背景移动效果 (a

[复制链接]

该用户从未签到

发表于 2011-10-22 13:37:06 | 显示全部楼层 |阅读模式
先看ANDROID QQ截图:


再看DEMO截图:


直接看代码: public class test3 extends Activity {

        

        private NewLayOut layout;

        

        private myThread mThread;

        

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);

            layout = (NewLayOut) inflater.inflate(R.layout.move, null);

            

            ImageView button = (ImageView)layout.findViewById(R.id.ImageView01);

            button.setOnClickListener(mClickListener);

            ImageView button2 = (ImageView)layout.findViewById(R.id.ImageView02);

            button2.setOnClickListener(mClickListener);

            ImageView button3 = (ImageView)layout.findViewById(R.id.ImageView03);

            button3.setOnClickListener(mClickListener);

            

            this.setContentView(layout);

    }

   

    private View.OnClickListener mClickListener = new View.OnClickListener() {

               

                public void onClick(View v) {

                        startMove(v);

                }

        };

        

        private void startMove(View v)

    {

            stopThread();//停止之前的线程

                mThread = new myThread(v);

                mThread.start();

    }

        

        private void stopThread()

    {

            if (mThread != null)

                {

                    try

                        {

                            layout.mIsStop = true;

                                mThread.join();

                        }

                        catch(Exception e)

                        {

                                e.printStackTrace();

                        }

                }

    }

        

        class myThread extends Thread

    {

            private View mView;

            

            public myThread(View v){ this.mView = v; }

            

                public void run() {

                        layout.doWork(this.mView);

                }

            

    }

}
NewLayOut 类 继承 LinearLayout,因为需要在LinearLayout里面画图
package test3.program;



import android.content.Context;



import android.graphics.Canvas;

import android.graphics.Rect;

import android.graphics.BitmapFactory;

import android.graphics.drawable.BitmapDrawable;

import android.util.AttributeSet;

import android.view.View;

import android.widget.LinearLayout;



public class NewLayOut extends LinearLayout {



        private static final short SPEED = 15;

        

        private Context mContext;

        private Rect mNowRect;//当前的区域

        private Rect mEndRect;//结束的区域

        private BitmapDrawable mSelecter;//移动的半透明背景bitmaip

        private boolean mSyn = false;//循环和onDraw同步

        public boolean mIsStop = false;//是否到达指定区域

        

        public NewLayOut(Context context) {

                super(context);

                init(context);

        }

        

        public NewLayOut(Context context, AttributeSet attrs) {

                super(context, attrs);

                init(context);

        }

        

        private void init(Context context)

        {

                mContext = context;

                mSelecter = new BitmapDrawable(

                                BitmapFactory.decodeResource(mContext.getResources(),

                                                R.drawable.topbar_select));

                mNowRect = new Rect();

                mEndRect = new Rect();

        }

        

        protected void onLayout(boolean paramBoolean, int paramInt1, int paramInt2, int paramInt3, int paramInt4)

        {

                super.onLayout(paramBoolean, paramInt1, paramInt2, paramInt3, paramInt4);

                this.getChildAt(0).getHitRect(mNowRect);//取得第一个控制区域作为起始区域

        }

        

        /**

         *

         * @param v 目标控件

         */

        public void doWork(View v)

        {

                v.getHitRect(this.mEndRect);

               

                if (this.mNowRect.right < this.mEndRect.right)

                {

                        work(new RunForword()

                        {

                                public void run()

                                {

                                        mNowRect.left += SPEED;//每次左边移动15格

                                        mNowRect.right += SPEED;//每次右边移动15格

                                       

                                        System.out.println("is run run run");

                                       

                                        if (mNowRect.right >= mEndRect.right)//如果移动超出或等于目标区域

                                                ReachRect();

                                }

                        });

                }

                else if(this.mNowRect.right > this.mEndRect.right)

                {

                        work(new RunForword()

                        {

                                public void run()

                                {

                                        mNowRect.left -= SPEED;//每次左边移动15格

                                        mNowRect.right -= SPEED;//每次右边移动15格

                                       

                                        if (mNowRect.right <= mEndRect.right)//如果移动超出或等于目标区域

                                                ReachRect();

                                }

                        });

                }

        }

        

        private void work(RunForword run)

        {

                this.mIsStop = false;

                while(!this.mIsStop)

                {

                        if(this.mSyn)//画图与循环同步

                        {

                                run.run();

                                System.out.println("is running!");

                                this.mSyn = false;

                                this.postInvalidate();

                                //Thread.sleep(35);

                        }

                }

        }

        

        /**

         * 到达目的地

         */

        private void ReachRect()

        {

                mNowRect.left = mEndRect.left;

                mNowRect.right = mEndRect.right;

                mIsStop = true;

        }

        

        protected void onDraw(Canvas canvas)

        {

                super.onDraw(canvas);

               

                mSelecter.setBounds(mNowRect);

                mSelecter.draw(canvas);

                this.mSyn = true;



                System.out.println("is ondraw");

        }

        

        public interface RunForword

        {

                void run();

        }

}
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:37:16 | 显示全部楼层

Re:[实例教程]仿Android

学习啦,支持
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:37:24 | 显示全部楼层

Re:[实例教程]仿Android

学习学习
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:37:34 | 显示全部楼层

Re:[实例教程]仿Android

学习 学习了
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:37:43 | 显示全部楼层

Re:[实例教程]仿Android

围观呵呵
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:37:56 | 显示全部楼层

Re:[实例教程]仿Android

学习了…………
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:38:05 | 显示全部楼层

Re:[实例教程]仿Android

学习了,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-9 07:14 , Processed in 0.358244 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表