当前位置:  编程技术>移动开发
本页文章导读:
    ▪QQ顶栏扁圆透明背景移动的实现        QQ顶栏椭圆透明背景移动的实现! 先看ANDROID QQ截图: 再看DEMO截图: 直接看代码: public class test3 extends Activity { private NewLayOut layout; private myThread mThread; @Override public void onCreat.........
    ▪ layout_gravity跟gravity        layout_gravity和gravity 举例子说明吧。比如说button,android:layout_gravity 表示按钮在界面上的位置。android:gravity表示button上的字在button上的位置 ......
    ▪ AndFire防火墙1.2版本公布       AndFire防火墙1.2版本发布 AndFire is a android firewal software,It support to message filter,block calls,app firewall,ftp pop3 smtp block and virus firewall.You can block some network application software to help you save flow!AndFire是一款An.........

[1]QQ顶栏扁圆透明背景移动的实现
    来源: 互联网  发布时间: 2014-02-18
QQ顶栏椭圆透明背景移动的实现!
先看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();
	}
}


编写的过程中发现一点问题:

第一:画图与循环同步的问题

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);
			}
		}
	}


如果把 if(this.mSyn) 这段去掉 看图:



就是while循环好多次之后,onDraw才执行一次。猜想onDraw在上一次未执行完之前是不会被执行第二次的(onDraw好像开了一个新线程画图,但看SDK源码实现没看出个端儿。),所以需要做一个这样的同步。这里是继承LinearLayout的,不知道直接继承View会不会出现这种情况。上面的程序,onDraw执行完的时间大概在Thread.sleep(35)这么多时间。

看看把 if(this.mSyn) 加上去后的打印数据 看图:



第二:把移动的运算部份run.run();的方法直接放到onDraw里面运算

private void work(RunForword run)
	{
		this.mIsStop = false;
		while(!this.mIsStop)
		{
			if(this.mSyn)//画图与循环同步
			{

				System.out.println("is running!");
				this.mSyn = false;
				this.postInvalidate();
				//Thread.sleep(35);
			}
		}
	}
protected void onDraw(Canvas canvas)
	{
		super.onDraw(canvas);
		run.run();//大概时这个意思。。当实这样实写是不行的。
		mSelecter.setBounds(mNowRect);
		mSelecter.draw(canvas);
		this.mSyn = true;

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


这样做的话,发觉移动的侦数比较底下,分析了一下原因。首先上面讲的,因为onDraw在上一次未画完图之前,第二次是不会运行的。而while循环又无视onDraw方法未执行完毕。所以在onDraw未执行完毕的过程中。运行run.run(),把下一次移动的数据准备好了。所以侦数就稍有上升了。

最后附上DEMO的源码: test3.rar

如上描述,有不正确的地方,请指教。谢谢。。

完毕。

有关ANDROID QQ的一些实现方法,请听下回分解。
1 楼 offeeyang 2010-08-28  
效果不错啊
2 楼 Czero 2010-09-15  
不错啊,楼主有心
3 楼 huanxisha147 2010-11-05  
不错 我要深入学习 
4 楼 Coding.Ghost 2010-12-16  
进入高级View必须学习的东西。
5 楼 ffshow2006 2011-01-05  
下回分解在哪?要是引用的给个链接啊。
6 楼 binner 2011-03-31  
cool!

    
[2] layout_gravity跟gravity
    来源: 互联网  发布时间: 2014-02-18
layout_gravity和gravity

举例子说明吧。比如说button,
android:layout_gravity 表示按钮在界面上的位置。
android:gravity表示button上的字在button上的位置


    
[3] AndFire防火墙1.2版本公布
    来源: 互联网  发布时间: 2014-02-18
AndFire防火墙1.2版本发布

AndFire is a android firewal software,It support to message filter,block calls,app firewall,ftp pop3 smtp block and virus firewall.You can block some network application software to help you save flow!
AndFire是一款Android 防火墙软件,主要支持黑名单信息过滤,阻止来电,应用软件阻止网络,FTP,POP3,SMTP阻止,病毒防火墙等,你可以阻止一些联网的应用软件,帮助你节约网络流量!
version 1.1 - 1.1版本
1、block blacklist calls or all calls(阻止黑名单来电或所以来电)
2、filter sms(过滤短信)
3、block networking app(阻止连网应用)
4、block FTP,POP3,SMTP(阻止FTP,POP3,SMTP等端口)
5、virus firewall(病毒防火墙)

Version 1.2 - 1.2版本¶
1、add port scan firewall(增加端口扫描防火墙)
2、add sync flood firewall(增加同步包洪水防火墙)
3、modified to block calls error(修改了阻止来电一些错误)
4、modified to obtain super-user processing error(修改了获取超级用户时处理错误)
5、modify the firewall rules set error(修改了防火墙规则设置错误)
6、support the Chinese(支持中文)

 

了解更多:http://code.google.com/p/andbox

 

 

 

 

 

 

1 楼 zhuixinjian 2010-08-29  
防火墙。上次那个壁纸应用就是防火墙给闹的。手机需要防火墙??
2 楼 fonter 2010-08-29  
zhuixinjian 写道
防火墙。上次那个壁纸应用就是防火墙给闹的。手机需要防火墙??

嗯,要的。
3 楼 Wisdom7 2010-09-01  
之前装了个所谓诺顿的防火墙,MS什么效果都没有
4 楼 aa87963014 2010-09-01  
弄手机防火墙 还不如 弄一个 手机版 流量监控实用
5 楼 BarryWei 2010-09-02  
界面那些图标很不错,赞一个。
但如果内容和操作过于复杂,会把一部分用户阻挡在外。
所以,lz接下来可以测试一个2.0的版本,加入策略。
一般用户只需要导入策略文件就可以做一些默认的配置。
另外,也可以考虑用户界面的简化。。。
6 楼 fonter 2010-09-02  
BarryWei 写道
界面那些图标很不错,赞一个。
但如果内容和操作过于复杂,会把一部分用户阻挡在外。
所以,lz接下来可以测试一个2.0的版本,加入策略。
一般用户只需要导入策略文件就可以做一些默认的配置。
另外,也可以考虑用户界面的简化。。。

嗯。。你的建议不错....
7 楼 yagami 2010-09-02  
我电脑都不用防火墙和杀毒软件,更何况手机呢。
8 楼 fonter 2010-09-04  
wsmsnia 写道
yagami 写道
我电脑都不用防火墙和杀毒软件,更何况手机呢。

招聘1年以上美工、Java程序员(应届)
....

压。居然还来广告...嗯....

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