实现qq ipad客户端的对话框平滑移动的效果

实现qq ipad客户端的对话框平滑移动的效果,第1张

概述今天要写一个android对话框,实现对话框随着手指能够移动,而且当对话框移动到一定程度的时候,能够实现对话框在左右自动隐藏。这个功能比较难,需要系统的学习一下onTouch函数,现在贴出我的源代码: package com.yelbosh.test; import java.io.IOException; import com.yelbosh.test.classes.MyButton; imp

今天要写一个androID对话框,实现对话框随着手指能够移动,而且当对话框移动到一定程度的时候,能够实现对话框在左右自动隐藏。这个功能比较难,需要系统的学习一下ontouch函数,现在贴出我的源代码:

package com.yelbosh.test;@H_301_9@@H_301_9@@H_301_9@ import java.io.IOException;@H_301_9@@H_301_9@@H_301_9@ import com.yelbosh.test.classes.Mybutton;@H_301_9@@H_301_9@@H_301_9@ import androID.Manifest;@H_301_9@ import androID.opengl.Visibility;@H_301_9@ import androID.os.Bundle;@H_301_9@ import androID.app.Activity;@H_301_9@ import androID.app.AlertDialog;@H_301_9@ import androID.content.Context;@H_301_9@ import androID.content.DialogInterface;@H_301_9@ import androID.content.Intent;@H_301_9@ import androID.content.res.Resources;@H_301_9@ import androID.graphics.Bitmap;@H_301_9@ import androID.graphics.BitmapFactory;@H_301_9@ import androID.graphics.color;@H_301_9@ import androID.graphics.linearGradIEnt;@H_301_9@ import androID.text.Layout;@H_301_9@ import androID.util.Log;@H_301_9@ import androID.vIEw.ContextMenu;@H_301_9@ import androID.vIEw.ContextMenu.ContextMenuInfo;@H_301_9@ import androID.vIEw.animation.Animation;@H_301_9@ import androID.vIEw.animation.TranslateAnimation;@H_301_9@ import androID.vIEw.LayoutInflater;@H_301_9@ import androID.vIEw.Menu;@H_301_9@ import androID.vIEw.MenuItem;@H_301_9@ import androID.vIEw.MotionEvent;@H_301_9@ import androID.vIEw.VIEw;@H_301_9@ import androID.support.v4.app.NavUtils;@H_301_9@ import androID.webkit.*;@H_301_9@ import androID.Widget.button;@H_301_9@ import androID.Widget.EditText;@H_301_9@ import androID.Widget.FrameLayout;@H_301_9@ import androID.Widget.linearLayout;@H_301_9@ import androID.Widget.relativeLayout;@H_301_9@ import androID.Widget.TextVIEw;@H_301_9@ import androID.Widget.Toast;@H_301_9@@H_301_9@@H_301_9@ /**@H_301_9@  * @H_301_9@  * @author yelbosh@H_301_9@  * 2012-7-15@H_301_9@  */@H_301_9@ public class MainActivity extends Activity {@H_301_9@private static final boolean left = true;@H_301_9@private static final boolean RIGHT = false;@H_301_9@@H_301_9@private VIEw talkdiv;@H_301_9@private button photo;@H_301_9@private relativeLayout rl;@H_301_9@//talkdiv上面的Title@H_301_9@private TextVIEw Titlebar;@H_301_9@//设置talkIDv出现的方向@H_301_9@private boolean talkOrentation = left; @H_301_9@@H_301_9@private int WINDOW_HEIGHT;@H_301_9@private int WINDOW_WIDTH;@H_301_9@     @OverrIDe@H_301_9@     public voID onCreate(Bundle savedInstanceState) {@H_301_9@         super.onCreate(savedInstanceState);@H_301_9@         setContentVIEw(R.layout.activity_main);@H_301_9@         rl = (relativeLayout)findVIEwByID(R.ID.mainlayout);@H_301_9@         photo = (button)findVIEwByID(R.ID.myphoto);@H_301_9@         talkdiv = getLayoutInflater().inflate(R.layout.talk,rl,false);@H_301_9@         rl.addVIEw(talkdiv);@H_301_9@         talkdiv.setVisibility(VIEw.INVISIBLE);@H_301_9@         @H_301_9@         Titlebar = (TextVIEw)findVIEwByID(R.ID.Titlebar);@H_301_9@         @H_301_9@         //为Titlebar设置监听函数@H_301_9@         Titlebar.setontouchListener(new VIEw.OntouchListener() {@H_301_9@//记录初始位置@H_301_9@         int temp;@H_301_9@         int vIEwleft;@H_301_9@         @H_301_9@public boolean ontouch(VIEw arg0,MotionEvent event) {@H_301_9@// Todo auto-generated method stub@H_301_9@int eventaction = event.getAction();@H_301_9@int x = (int)event.getRawX();@H_301_9@@H_301_9@@H_301_9@switch (eventaction) {@H_301_9@case MotionEvent.ACTION_DOWN:@H_301_9@temp = (int) event.getRawX();//记录起始x坐标@H_301_9@vIEwleft = (int)MainActivity.this.talkdiv.getleft();@H_301_9@break;@H_301_9@case MotionEvent.ACTION_MOVE:@H_301_9@MainActivity.this.talkdiv.layout(vIEwleft+x-temp,vIEwleft+x-temp+MainActivity.this.talkdiv.getWIDth(),MainActivity.this.talkdiv.getHeight());@H_301_9@MainActivity.this.talkdiv.postInvalIDate();@H_301_9@break;@H_301_9@case MotionEvent.ACTION_UP:@H_301_9@//根据滑动的距离进行判断@H_301_9@//滑到右边@H_301_9@if((vIEwleft + x-temp) > 0.3*MainActivity.this.WINDOW_WIDTH){@H_301_9@@H_301_9@//滑向右边@H_301_9@Animation temani = new TranslateAnimation(MainActivity.this.talkdiv.getleft(),MainActivity.this.talkdiv.getWIDth(),0);@H_301_9@temani.setDuration(600);@H_301_9@MainActivity.this.talkdiv.startAnimation(temani);@H_301_9@MainActivity.this.talkdiv.setVisibility(VIEw.INVISIBLE);@H_301_9@//使其居中@H_301_9@MainActivity.this.talkdiv.layout(0,MainActivity.this.talkdiv.getHeight());@H_301_9@//设置下次从右边出现@H_301_9@MainActivity.this.talkOrentation = MainActivity.this.RIGHT;@H_301_9@}else if((vIEwleft + x-temp) < -0.3*MainActivity.this.WINDOW_WIDTH){@H_301_9@//滑向左边@H_301_9@Animation temani = new TranslateAnimation(vIEwleft + x-temp,-MainActivity.this.talkdiv.getWIDth(),0);@H_301_9@temani.setDuration(600);@H_301_9@MainActivity.this.talkdiv.startAnimation(temani);@H_301_9@MainActivity.this.talkdiv.setVisibility(VIEw.INVISIBLE);@H_301_9@MainActivity.this.talkdiv.layout(0,MainActivity.this.talkdiv.getHeight());@H_301_9@//设置下次从左边出现@H_301_9@MainActivity.this.talkOrentation = MainActivity.this.left;@H_301_9@}else{@H_301_9@//保持在(0,0)@H_301_9@Animation temani = new TranslateAnimation(vIEwleft + x-temp,0);@H_301_9@temani.setDuration(600);@H_301_9@MainActivity.this.talkdiv.startAnimation(temani);@H_301_9@//使其居中@H_301_9@MainActivity.this.talkdiv.layout(0,MainActivity.this.talkdiv.getHeight());@H_301_9@//重绘至中间@H_301_9@MainActivity.this.talkdiv.postInvalIDate();@H_301_9@}@H_301_9@break;@H_301_9@}@H_301_9@return true;@H_301_9@}@H_301_9@});@H_301_9@         @H_301_9@         @H_301_9@         WINDOW_HEIGHT = this.getwindowManager().getDefaultdisplay().getHeight();@H_301_9@         WINDOW_WIDTH = this.getwindowManager().getDefaultdisplay().getHeight();@H_301_9@         /**@H_301_9@          * 为按钮设置监听函数@H_301_9@          */@H_301_9@         photo.setonClickListener(new VIEw.OnClickListener() {@H_301_9@@H_301_9@public voID onClick(VIEw v) {@H_301_9@// Todo auto-generated method stub@H_301_9@//只有当其不可见的时候我们才执行动画@H_301_9@if(talkdiv.getVisibility() == VIEw.INVISIBLE){@H_301_9@talkdiv.setVisibility(VIEw.VISIBLE);@H_301_9@//判断应该从哪个方向拉出@H_301_9@int temx = MainActivity.this.talkOrentation?-MainActivity.this.talkdiv.getWIDth():MainActivity.this.talkdiv.getWIDth();@H_301_9@Animation translate = new TranslateAnimation(Animation.relative_TO_SELF,temx,Animation.relative_TO_PARENT,Animation.relative_TO_SELF,0);@H_301_9@translate.setDuration(200);@H_301_9@MainActivity.this.talkdiv.startAnimation(translate);@H_301_9@}@H_301_9@}@H_301_9@});@H_301_9@         @H_301_9@         @H_301_9@         //rl.addVIEw(talkdiv);@H_301_9@         @H_301_9@     }@H_301_9@@OverrIDe@H_301_9@     public boolean onCreateOptionsMenu(Menu menu) {@H_301_9@         getMenuInflater().inflate(R.menu.activity_main,menu);@H_301_9@         return true;@H_301_9@     }@H_301_9@@H_301_9@     @H_301_9@ }@H_301_9@

这是整个类所有的源代码,xml文件我就不写了,大家自己慢慢理解吧。

@H_301_9@

需要注意的几点:

注意ontouch的返回值。改成return true,这样onouch会继续监听

注意取得窗口长宽的方法:

 WINDOW_HEIGHT = this.getwindowManager().getDefaultdisplay().getHeight();@H_301_9@@H_301_9@

 WINDOW_WIDTH = this.getwindowManager().getDefaultdisplay().getHeight();@H_301_9@

@H_301_9@

这里我是根据窗口的横坐标的值来判断是否应该自动隐藏,并且以窗口的宽的三分之一为边界

注意动画效果的实现,我使用了TranslateAnimation这个类,但是貌似这个动画执行了之后对象又会返回到原来的位置。所以在动画执行完毕后我将其设置为不可见,这样的话我再将其layout中的位置设置为动画执行完毕后想将其放置 的位置这样的话就能达到想要的效果了。

总结

以上是内存溢出为你收集整理的实现qq ipad客户端的对话框平滑移动的效果全部内容,希望文章能够帮你解决实现qq ipad客户端的对话框平滑移动的效果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1090515.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存