今天要写一个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客户端的对话框平滑移动的效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)