先看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的一些实现方法,请听下回分解。
举例子说明吧。比如说button,
android:layout_gravity 表示按钮在界面上的位置。
android:gravity表示button上的字在button上的位置
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
嗯,要的。
但如果内容和操作过于复杂,会把一部分用户阻挡在外。
所以,lz接下来可以测试一个2.0的版本,加入策略。
一般用户只需要导入策略文件就可以做一些默认的配置。
另外,也可以考虑用户界面的简化。。。
但如果内容和操作过于复杂,会把一部分用户阻挡在外。
所以,lz接下来可以测试一个2.0的版本,加入策略。
一般用户只需要导入策略文件就可以做一些默认的配置。
另外,也可以考虑用户界面的简化。。。
嗯。。你的建议不错....
招聘1年以上美工、Java程序员(应届)
....
压。居然还来广告...嗯....