设置怎么查qq谁删掉我了了

APP111苹果园为用户提供苹果游戏软件介绍,视频,攻略,评测,iphone6游戏,iphone5s游戏下载
iphone6 plus软件下载,ipad mini软件,ipad游戏,最新最全的限时免费游戏信息热点导航:
          
插件安装删除设置知识扫盲
作者:camus_dvd
1.1 什么是.
UI (User Interface)
中文翻译:用户界面. 俗称:界面.
Addons (Add-Ons)
中文直译:附件,附加,附加软件. 俗称:插件.
解释:他们是一些附加的文件,被放置在玩家
游戏目录下的 Interface 文件夹中。
插件 使用暴雪提供的LUA和XML代码(官方API函数接口)来扩充玩家可以使用的用户界面
插件是通过(暴雪提供的)LUA和XML文件(函数)构成的,并且也是通过暴雪的编译机所解
释和执行的。因此,暴雪也不会封停任何使用插件的玩家。
Mod (Modules)
中文翻译:模块,组件.俗称:插件包(?!)... Mod是具有改变UI形状外观的系列Addons.
中文翻译:宏.俗称:宏.
宏使你能够创建自己独创的命令集,并可以通过点击一个自定义的按钮便完成一系列的命
宏 - 其实这个应该不算是真正的插件化改造,但是却能在游戏中使用 LUA 代码做一些
很方便的事情(比如一些条件判断什么什么的),这些东西完全是游戏内置的,并且这些
代码是通过暴雪的编译机(也就是WOW的游戏程序,而非其他执行程序,如WG所需要运行
的执行程序)所解释并且执行。所以一个宏究竟能做什么或者不能做什么完全是暴雪所规
定的。因此,暴雪不会封停任何使用宏的玩家。
所以大家以后就不要说求一个UI,一个UI要改可是要花很多插件的,说求一个插件或者
addon就可以了
1.2 插件的使用
-1.2.1 安装
如果你以前从来没有安装过任何Addons/Mod(插件),那么有几个小任务在你安装Addons(
插件)之前.
1).依次创建目录, 你的wow安装目录\Interface\Addons interface和addons如果存在
就不用安装了
2).下载下来插件以后,看压缩包
(1)如果是interface目录,那就直接接压到你的wow安装目录里面
(2)如果是addons目录,那就直接接压到interface目录下
(3)非以上三个的话,就解压到addons目录下
3).另外某些插件对某些插件或者是Function Library(功能库)有依赖性,请把被依赖的
Addons/Mod(插件)也下载下来并安装.
4).角色选择画面的左下方有一个按钮"插件",可以便于你在进入游戏之前调节具体加载
1.2.2 删除
1.如果装的是Addons,那么只需要删除 Interface\addons 目录下的相关文件夹就可以了
2.Mod有两种情况,一种是在线安装版,一种是解压版.
a.如果是在线安装的,可能需要在添加删除里面删除,如果找不到,那么就手动把
X:\World Of Warcraft\ 目录下的相关文件删除,再把 X:\World Of
Warcraft\Interface\ 目录下的相关文件夹删除.
b.如果是解压版,只需要把 X:\World Of Warcraft\Interface\ 目录下的相关文件夹
1.2.3 设置
1).因为有些Addons/Mod(插件)需要某些命令来进行调整插件,所有在对插件进行调试之
前,把命令给记下来.
比如AF_GoodTip调用设置窗口的命令是/aftt
2).运行游戏,一般情况下Addons/Mod(插件)会自动运行,如果没有,那请参考Addons/Mod(
插件)说明,里面会有教你怎么调出Addons/Mod(插件)来的方法.
1.2.4 为什么我删除了插件再装还是有毛病?
其实单单删除了interface是不够的,
因为大部分插件的具体设置是在 wow安装目录\WTF\accounts\你的帐户名
\SavedVariables.lua 里面
有的可能还会保存在其他地方,DUF是存在插件目录下,
所以重置插件的话可能需要删除WTF目录, (切记记得先备份,免得不必要的损失!)
1.2.5 我在网吧上网,每次上都要重新调快捷键和插件,怎么解决?
其实解决办法很简单,插件在interface里面,设置在WTF目录里面
把这两个文件夹打个包传到邮箱里,每次上机的时候下下来解压到wow目录里面,方便快捷
只要保留设置信息的话,只需打包WTF目录就可以了,打包前记得删除 \WTF\accounts\ 里
面非你帐号的那个目录,减小点重量,几K而已,但是保证了干净.
1.2.6 如何在游戏里重新启动我的插件?
按下“Enter”,在输入栏里面输入 /console reloadui
1.2.7 插件版本报错怎么办
打开插件文件夹里面后缀名为TOC的文件,把开头Interface后面的数字改为1500就可以
如果再游戏里还是无法使用,那么解答如下:
(1)使用方法有误
(2)该插件使用了一些语言判定的东西,只认英文,中文不认
(3)需要修改其中参数
遇到以上三种中之任何一种,最好的办法就是“等”!等别人修改汉化!
1.2.8 我的插件突然出现开了这样或那样的毛病,怎么办?
插件的设置一般都保存在 WTF\Accounts\你的帐号名\SavedVariables.lua 这个文件里
面,所以出现毛病的时候,
可以先删除这个文件,再进去重新设置
当然也有少数插件会在自己的文件夹里保存设置
1.3 如何修改主界面
答:在我的理解里,把主界面分为4块.
要修改主界面直到其适合自己,就需要把这4部分都修改或部分修改.(看个人需求)
(以下小标题所谈之框体或界面均为未装任何插件时候的官方界面)
图示见本楼底部 感谢大米的金击圆弧提供图片-唯一的LM牛头
++++++++++++++++++++++++++++++++++++++++++++++
(1) 目标框体 (其实叫做 Unit Frame最合适)
就是一般看到的角色框体,上面有自己的血槽(HP Bar),法力槽(Mana Bar)和角色头像等
一些人会觉得系统自带的没有个性或者功能不够,这里提供几个
修改这个的插件主要有: (这些插件已经包含了组队,自己,敌人之类所有和角色框体相关
这个插件被人诟病最多的就是字太小,我没有用过,所以不好作评.但是个人感觉其显示风
格非常简洁,会尝试一下.
Discord Unit Frame
设置看似很多,但恰恰是3个里面最有个性的,而且菜单简单明了,个人不觉得麻烦
现在市面上流行的有两个版本,Nymbia's Perl和原始的Perl,主要是显示风格方面的差异
,看个人喜好了
对于CWOW,由于版本比MF低了很多,所以新版本的Perl往往需要修改才可以使用.
+++++++++++++++++++++++++++++++++++++++++
(2)系统栏 (老外叫MenuBar,我在这里扩大一下含义)
坐落于主界面最下方,包括什么经验值,菜单,技能,延迟,背包那个
如果说改变以后变化最大,这个应该就是首当其冲了.
隐藏系统栏,使得自己的动作条更加符合自己的使用需求,改的就使这个部分.
我们需要使用动作条插件去改.
现在最流行的应该是两个FlexBar和Discord Action Bar
前者功能强大,稍难上手,
后者则简单易用
+++++++++++++++++++++++++++++++++++++++++++
(3)右上方的小地图(MiniMap)区
这个区域一般是动的最少的.有些插件会把自己的按钮吸附在小地图周围,比如
Atlas,MonkeyQuest之类的.
还有一些修改这个MiniMap的小插件.
比如加东南西等方向显示(英文简写,E S W);屏蔽缩放按钮;只显示MiniM放大MiniMap
的界面,这里就不一一赘述了
+++++++++++++++++++++++++++++++++++++++++++
(4)细节方面
比如系统信息条(ToolTip),UI大小,排列位置之类的,大家就自己掌握吧.
1.4 插件的合法性(牵涉到部分插件的争议)
说老实话,如果说插件可以提供便利就叫做外挂的话,那你真是大错特错了,打个比方
,如果官方做一件事情需要3步,插件可能连简化1步都不能很好的做到,因为blizzard
对函数库限定的太死了。
方便也方便不到哪里去,因为可以自动执行的函数blizzard根本就不提供!
但是在中国情况变得很微妙,9C出来说从来没有鼓励大家使用插件,现在很多玩家表示用
了合法插件,诸如BF,WOWShell,小强或者其他一些单体插件被封.出现这些情况我们感到
痛心疾首(在相信玩家的基础上)。但是对于运营商,我们只能希望出来给一个很好的
解释而不是一棒子打死所有插件。插件和外挂是不一样的!
从个人经历来说,我从公测的第一天开始就把界面改的一塌糊涂,到现在也没有封!网
吧里很多用BF,wowshell的同学也没有封!
再说一下Atlas,这个副本地图显示软件不过就是在游戏里面调用几张图片
试想如果算是作弊,那么坐在电脑前抱着个印着地图的书算不算作弊,是不是也要封?
我就是把我LP的照片贴上去又怎么样? 服务器端连你看的什么图片都不知道!
而且Atlas的地图也不是很方便,又没有位置提示,就是一个随身携带的地图罢了
但是在中国,我们不能给出肯定的答复,因为情况特殊!
我们在这里要说的是:理论上blizzard和9C不会也没有权利封锁任何使用插件的玩家
screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border=0>
点击复制文章地址,推荐给QQ和MSN上的朋友
巫妖王之怒数据库推荐
台服3.30关注
      
     
近国服3.13关注
      
     
         
          
竞技场第六季
         
          
其他频道推荐js设置cookie有很多种方法。
第一种:(这个是w3c官网的代码)
//设置cookie
function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires="+d.toUTCString();
document.cookie = cname + "=" + cvalue + "; " +
//获取cookie
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i&ca. i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1);
if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
return "";
//清除cookie
function clearCookie(name) {
setCookie(name, "", -1);
function checkCookie() {
var user = getCookie("username");
if (user != "") {
alert("Welcome again " + user);
user = prompt("Please enter your name:", "");
if (user != "" && user != null) {
setCookie("username", user, 365);
checkCookie();
//JS操作cookies方法!
//写cookies
function setCookie(c_name, value, expiredays){
    var exdate=new Date();
    exdate.setDate(exdate.getDate() + expiredays);
    document.cookie=c_name+ "=" + escape(value) + ((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
//读取cookies
function getCookie(name)
var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
if(arr=document.cookie.match(reg))
return (arr[2]);
return null;
//删除cookies
function delCookie(name)
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval=getCookie(name);
if(cval!=null)
document.cookie= name + "="+cval+";expires="+exp.toGMTString();
//使用示例
setCookie('username','Darren',30)
alert(getCookie("username"));
&第三个例子
&meta http-equiv="Content-Type" content="text/ charset=utf-8" /&
&script language="JavaScript" type="text/javascript"&
function addCookie(objName, objValue, objHours){//添加cookie
var str = objName + "=" + escape(objValue);
if (objHours & 0) {//为0时不设定过期时间,浏览器关闭时cookie自动消失
var date = new Date();
var ms = objHours * 3600 * 1000;
date.setTime(date.getTime() + ms);
str += "; expires=" + date.toGMTString();
document.cookie =
alert("添加cookie成功");
function getCookie(objName){//获取指定名称的cookie的值
var arrStr = document.cookie.split("; ");
for (var i = 0; i & arrStr. i++) {
var temp = arrStr[i].split("=");
if (temp[0] == objName)
return unescape(temp[1]);
function delCookie(name){//为了删除指定名称的cookie,可以将其过期时间设定为一个过去的时间
var date = new Date();
date.setTime(date.getTime() - 10000);
document.cookie = name + "=a; expires=" + date.toGMTString();
function allCookie(){//读取所有保存的cookie字符串
var str = document.
if (str == "") {
str = "没有保存任何cookie";
alert(str);
function $(m, n){
return document.forms[m].elements[n].
function add_(){
var cookie_name = $("myform", "cookie_name");
var cookie_value = $("myform", "cookie_value");
var cookie_expireHours = $("myform", "cookie_expiresHours");
addCookie(cookie_name, cookie_value, cookie_expireHours);
function get_(){
var cookie_name = $("myform", "cookie_name");
var cookie_value = getCookie(cookie_name);
alert(cookie_value);
function del_(){
var cookie_name = $("myform", "cookie_name");
delCookie(cookie_name);
alert("删除成功");
&form name="myform"&
&label for="cookie_name"&
&input type="text" name="cookie_name" /&
&label for="cookie_value"&
&input type="text" name="cookie_value" /&
&label for="cookie_expireHours"&
多少个小时过期
&input type="text" name="cookie_expiresHours" /&
&input type="button" value="添加该cookie" onclick="add_()"/&&input type="button" value="读取所有cookie" onclick="allCookie()"/&&input type="button" value="读取该名称cookie" onclick="get_()"/&&input type="button" value="删除该名称cookie" onclick="del_()"/&
chrome浏览器在本地获取不到cookie。必须在服务器上才可以。如果是本地的话,你可以放到local的www目录下面。
Google Chrome只支持在线网站的cookie的读写操作,对本地html的cookie操作是禁止的。所以下面的代码如果你写在一个本地的html文件中,将弹出的对话框内容为空。
document.cookie = "Test=cooo";alert(document.cookie);
如果这个页面是在线网站的内容,则会正常显示cookie内容Test=cooo等等。
阅读(...) 评论()29623人阅读
转载请注明本文出自xiaanming的博客(),请尊重他人的辛勤劳动成果,谢谢!今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下,之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就知道拖动到什么位置item会删除,什么位置Item不删除,用户体验更好了,还有一个效果,就是我们滑动删除了item的时候,ListView的其他item会出现向上或者向下滚动的效果,感觉效果很棒,所以在GitHub上面搜索了下,发现很多开源库都有这个效果,比如,&等等,我看了下实现原理,使用的是Jake Wharton的动画开源库,这个库究竟是干嘛的呢?在API3.0(Honeycomb), SDK新增了一个android.animation包,里面的类是实现动画效果相关的类,通过Honeycomb API,能够实现非常复杂的动画效果,但是如果开发者想在3.0以下使用这一套API, 则需要使用开源框架Nine Old Androids,在这个库中会根据我们运行的机器判断其SDK版本,如果是API3.0以上则使用Android自带的动画类,否则就使用Nine Old Androids库中,这是一个兼容库,接下来我们就来看看这个效果的具体实现吧实现该效果的主要思路先根据手指触摸的点来获取点击的是ListView的哪一个Item当手指在屏幕上面滑动的时候,我们要使得Item跟随手指的滑动而滑动当我们抬起手指的时候,我们根据滑动的距离或者手指在屏幕上面的速度来判断Item是滑出屏幕还是滑动至其实位置Item滑出屏幕时,使ListView的其他item产生向上挤压或者向下挤压的效果大致的思路这是这四步,其中的一些细节接下来我会一一为大家解答的,接下来我们就用代码来实现这种效果吧首先我们新建一个工程,叫Swipedismisslistview,我们需要将Nine Old Androids这个库引入到工程,大家可以去下载,可以使用Jar包,也可以使用工程库的形式引入到我们自己的工程,我们还需要自定义一个ListView,我们先看代码然后给大家讲解下具体的功能实现package com.example.
import static com.nineoldandroids.view.ViewHelper.setA
import static com.nineoldandroids.view.ViewHelper.setTranslationX;
import android.content.C
import android.util.AttributeS
import android.view.MotionE
import android.view.VelocityT
import android.view.V
import android.view.ViewC
import android.view.ViewG
import android.widget.AdapterV
import android.widget.ListV
import com.nineoldandroids.animation.A
import com.nineoldandroids.animation.AnimatorListenerA
import com.nineoldandroids.animation.ValueA
import com.nineoldandroids.view.ViewH
import com.nineoldandroids.view.ViewPropertyA
* @blog http://blog.csdn.net/xiaanming
* @author xiaanming
public class SwipeDismissListView extends ListView {
* 认为是用户滑动的最小距离
private int mS
* 滑动的最小速度
private int mMinFlingV
* 滑动的最大速度
private int mMaxFlingV
* 执行动画的时间
protected long mAnimationTime = 150;
* 用来标记用户是否正在滑动中
private boolean mS
* 滑动速度检测类
private VelocityTracker mVelocityT
* 手指按下的position
private int mDownP
* 按下的item对应的View
private View mDownV
private float mDownX;
private float mDownY;
* item的宽度
private int mViewW
* 当ListView的Item滑出界面回调的接口
private OnDismissCallback onDismissC
* 设置动画时间
* @param mAnimationTime
public void setmAnimationTime(long mAnimationTime) {
this.mAnimationTime = mAnimationT
* 设置删除回调接口
* @param onDismissCallback
public void setOnDismissCallback(OnDismissCallback onDismissCallback) {
this.onDismissCallback = onDismissC
public SwipeDismissListView(Context context) {
this(context, null);
public SwipeDismissListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
public SwipeDismissListView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
ViewConfiguration vc = ViewConfiguration.get(context);
mSlop = vc.getScaledTouchSlop();
mMinFlingVelocity = vc.getScaledMinimumFlingVelocity() * 8; //获取滑动的最小速度
mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();
//获取滑动的最大速度
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
handleActionDown(ev);
case MotionEvent.ACTION_MOVE:
return handleActionMove(ev);
case MotionEvent.ACTION_UP:
handleActionUp(ev);
return super.onTouchEvent(ev);
* 按下事件处理
* @param ev
private void handleActionDown(MotionEvent ev) {
mDownX = ev.getX();
mDownY = ev.getY();
mDownPosition = pointToPosition((int) mDownX, (int) mDownY);
if (mDownPosition == AdapterView.INVALID_POSITION) {
mDownView = getChildAt(mDownPosition - getFirstVisiblePosition());
if (mDownView != null) {
mViewWidth = mDownView.getWidth();
//加入速度检测
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(ev);
* 处理手指滑动的方法
* @param ev
private boolean handleActionMove(MotionEvent ev) {
if (mVelocityTracker == null || mDownView == null) {
return super.onTouchEvent(ev);
// 获取X方向滑动的距离
float deltaX = ev.getX() - mDownX;
float deltaY = ev.getY() - mDownY;
// X方向滑动的距离大于mSlop并且Y方向滑动的距离小于mSlop,表示可以滑动
if (Math.abs(deltaX) & mSlop && Math.abs(deltaY) & mSlop) {
mSwiping =
//当手指滑动item,取消item的点击事件,不然我们滑动Item也伴随着item点击事件的发生
MotionEvent cancelEvent = MotionEvent.obtain(ev);
cancelEvent.setAction(MotionEvent.ACTION_CANCEL |
(ev.getActionIndex()&& MotionEvent.ACTION_POINTER_INDEX_SHIFT));
onTouchEvent(cancelEvent);
if (mSwiping) {
// 跟谁手指移动item
ViewHelper.setTranslationX(mDownView, deltaX);
// 透明度渐变
ViewHelper.setAlpha(mDownView, Math.max(0f, Math.min(1f, 1f - 2f * Math.abs(deltaX)/ mViewWidth)));
// 手指滑动的时候,返回true,表示SwipeDismissListView自己处理onTouchEvent,其他的就交给父类来处理
return super.onTouchEvent(ev);
* 手指抬起的事件处理
* @param ev
private void handleActionUp(MotionEvent ev) {
if (mVelocityTracker == null || mDownView == null|| !mSwiping) {
float deltaX = ev.getX() - mDownX;
//通过滑动的距离计算出X,Y方向的速度
puteCurrentVelocity(1000);
float velocityX = Math.abs(mVelocityTracker.getXVelocity());
float velocityY = Math.abs(mVelocityTracker.getYVelocity());
boolean dismiss = //item是否要滑出屏幕
boolean dismissRight =//是否往右边删除
//当拖动item的距离大于item的一半,item滑出屏幕
if (Math.abs(deltaX) & mViewWidth / 2) {
dismissRight = deltaX & 0;
//手指在屏幕滑动的速度在某个范围内,也使得item滑出屏幕
} else if (mMinFlingVelocity &= velocityX
&& velocityX &= mMaxFlingVelocity && velocityY & velocityX) {
dismissRight = mVelocityTracker.getXVelocity() & 0;
if (dismiss) {
ViewPropertyAnimator.animate(mDownView)
.translationX(dismissRight ? mViewWidth : -mViewWidth)//X轴方向的移动距离
.setDuration(mAnimationTime)
.setListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animation) {
//Item滑出界面之后执行删除
performDismiss(mDownView, mDownPosition);
//将item滑动至开始位置
ViewPropertyAnimator.animate(mDownView)
.translationX(0)
.setDuration(mAnimationTime).setListener(null);
//移除速度检测
if(mVelocityTracker != null){
mVelocityTracker.recycle();
mVelocityTracker =
mSwiping =
* 在此方法中执行item删除之后,其他的item向上或者向下滚动的动画,并且将position回调到方法onDismiss()中
* @param dismissView
* @param dismissPosition
private void performDismiss(final View dismissView, final int dismissPosition) {
final ViewGroup.LayoutParams lp = dismissView.getLayoutParams();//获取item的布局参数
final int originalHeight = dismissView.getHeight();//item的高度
ValueAnimator animator = ValueAnimator.ofInt(originalHeight, 0).setDuration(mAnimationTime);
animator.start();
animator.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animation) {
if (onDismissCallback != null) {
onDismissCallback.onDismiss(dismissPosition);
//这段代码很重要,因为我们并没有将item从ListView中移除,而是将item的高度设置为0
//所以我们在动画执行完毕之后将item设置回来
ViewHelper.setAlpha(dismissView, 1f);
ViewHelper.setTranslationX(dismissView, 0);
ViewGroup.LayoutParams lp = dismissView.getLayoutParams();
lp.height = originalH
dismissView.setLayoutParams(lp);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator valueAnimator) {
//这段代码的效果是ListView删除某item之后,其他的item向上滑动的效果
lp.height = (Integer) valueAnimator.getAnimatedValue();
dismissView.setLayoutParams(lp);
* 删除的回调接口
* @author xiaanming
public interface OnDismissCallback {
public void onDismiss(int dismissPosition);
看过你会发现,这个自定义的SwipeDismissListView只重写了onTouchEvent()方法,其实我们重写这一个方法就能实现我们需要的效果1. 我们先看手指按下屏幕的处理方法handleActionDown();该方法里面根据我们手指按下的点根据pointToPosition()方法来获取我们点击的position,然后利用getChildAt()来获取我们按下的item的View对象,并且加入手指在屏幕滑动的速度检查,这一步相对来说还是比较简单2. 接下来就是手指在屏幕上面滑动的处理方法handleActionMove(),这个方法就稍微的复杂些,我们需要根据手指在X轴的滑动距离和Y轴的滑动距离来判断是ListView&item的水平滑动还是ListView的上下滑动,当满足Math.abs(deltaX) & mSlop && Math.abs(deltaY) & mSlop这个条件时候,我们用一个布尔值mSwiping来标记Item现在处于水平滑动的状态,这时候我们需要处理Item跟随手指的滑动而滑动的逻辑,我们使用ViewHelper来处理Item的滑动逻辑,这个类会根据机器的SDK版本来判断使用Android系统的API还是NineOldandroids中自己实现的API使得View滑动的效果,NineOldandroids中主要使用Camera(可以实现各种复杂动画效果的类),我们直接使用ViewHelper的setTranslationX()和setAlpha()就实现了item滑动和透明度渐变的效果,为了使得我们在滑动item的时候,ListView不上下滚动,我们必须返回true来屏蔽ListView的上下滚动,这里需要我们要非常熟悉Android的事件分发机制,这里我就不说明了,大家不了解的去网上找找相关的文章看看还有一个问题,就是当我们滑动ListView的item的时候,会伴随着item的点击事件,这不是我们想要的效果,所以当Item滑动的时候我们需要取消ListView Item的点击事件3. 在看手指抬起的时候的处理方法handleActionUp(),这里面需要根据手指的滑动速度或者Item移动的距离来判断Item是滑出屏幕还是滑动至起始位置,并且要判断item向左还是向右滑出屏幕等等逻辑,具体的逻辑可以看代码,相信大家都看得懂.我这里要说说ViewPropertyAnimator类,这个类能更好的实现一个View同时进行多个动画的功能,当然我们也可以使用ObjectAnimator利用AnimatorSet来实现一个View上的多个同时进行的动画效果,例如我们可以将
ViewPropertyAnimator.animate(mDownView)
.translationX(dismissRight ? mViewWidth : -mViewWidth)//X轴方向的移动距离
.setDuration(mAnimationTime)
.setListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animation) {
//Item滑出界面之后执行删除
performDismiss(mDownView, mDownPosition);
});替换成AnimatorSet set = new AnimatorSet();
set.playTogether(ObjectAnimator.ofFloat(mDownView, &translationX&, dismissRight ? mViewWidth : -mViewWidth),
ObjectAnimator.ofFloat(mDownView, &alpha&, 0));
set.setDuration(mAnimationTime).start();
set.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animation) {
//Item滑出界面之后执行删除
performDismiss(mDownView, mDownPosition);
});在效果上面是一样的,但是ViewPropertyAnimator在性能上要比使用ObjectAnimator来实现多个同时进行的动画要高的多,举个例子,假如要对View使用移动和透明度的动画,使用ViewPropertyAnimator的话,某个时间点上我们只需要调用一次invalidate()方法刷新界面就行了,而使用ObjectAnimator的话,移动的动画需要调用invalidate(),透明度的动画也需要调用invalidate()方法,在性能上使用AnimationSet比ViewPropertyAnimator要低,但是有的时候我们还是需要使用ObjectAnimator,比如,在某个时间内,我们需要将View先变大在变小在变大等复杂情况,这时候ObjectAnimator就派上用场了,例如ObjectAnimator.ofInt(mDownView, &scaleX&, 0 ,100 ,0, 100).setDuration(100).start()通过上面的几步我们就实现了ListView的左右滑动删除item的效果啦,但是还有一个效果,item删除之后,ListView的其他item向上或者向下缓缓滑动的效果,实现这个也很容易,就是动态设置item的高度,item高度逐渐变小,这样其他的item就会出现向上或者向下挤压的效果啦!4. 这里我们使用的是ValueAnimator这个类,这个类并不是针对View作用的动画,而是对某个值作用的动画,他默认使用的Interpolator(插补器)是AccelerateDecelerateInterpolator(开始和结束的时候慢,中间快) ,&举个很简单的例子,我们在10秒内使用ValueAnimator将某个值从0变化到100,如果使用LinearInterpolator(线性插补器,匀速变化)在第2秒的时候,这个值变成了20,而是用AccelerateDecelerateInterpolator,可能在第二秒的时候这个值为15或者13,所以我们在ValueAnimator变化的时候设置值动画变化的监听器AnimatorUpdateListener就知道某个时间这个值变成了多少,从而对View的某个属性进行设置(例如大小),所以ValueAnimator是间接的对View设置动画的了解了ValueAnimator的使用原理,我们就可以现实上面的动画效果了,我们使用ValueAnimator将item的高度变成0,设置ValueAnimator变化的监听,我们在回调函数onAnimationUpdate()中动态的设置item的高度, 然后添加AnimatorListener监听动画的状态(例如动画开始,结束,重复等)监听,在动画结束的回调函数onAnimationEnd()中删除该item的数据,调用notifyDataSetChanged刷新ListView,看看下面这段代码ViewHelper.setAlpha(dismissView, 1f);
ViewHelper.setTranslationX(dismissView, 0);
ViewGroup.LayoutParams lp = dismissView.getLayoutParams();
lp.height = originalH
dismissView.setLayoutParams(lp);我们使用动画只是将item移动出了屏幕,并且将item的高度设置为了0,并没有将item的View从ListView中Remove掉,况且ListView也不能直接Remove掉Item的,只能将数据源删除,在调用notifyDataSetChanged()刷新,所以我们需要将刚刚滑出屏幕高度设置为0的Item恢复回来自定义控件的代码我们已经编写完了,接下来我们就要使用它了,先看界面的布局代码&RelativeLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&&
&com.example.swipedismisslistview.SwipeDismissListView
android:id=&@+id/swipeDismissListView&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:listSelector=&@android:color/transparent&
android:cacheColorHint=&@android:color/transparent&&
&/com.example.swipedismisslistview.SwipeDismissListView&
&/RelativeLayout&
很简单,一个RelativeLayout包裹我们自定义的ListView控件,接下来就是主界面的代码编写,跟平常的ListView使用一样,但是我们需要设置OnDismissCallback()监听,在onDismiss()中删除该位置对于的数据,刷新ListViewpackage com.example.
import java.util.ArrayL
import java.util.L
import android.app.A
import android.os.B
import android.view.V
import android.widget.AdapterV
import android.widget.AdapterView.OnItemClickL
import android.widget.ArrayA
import android.widget.T
import com.example.swipedismisslistview.SwipeDismissListView.OnDismissC
public class SwipeActivity extends Activity {
private SwipeDismissListView swipeDismissListV
private ArrayAdapter&String&
private List&String& dataSourceList = new ArrayList&String&();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_swipe);
private void init() {
swipeDismissListView = (SwipeDismissListView) findViewById(R.id.swipeDismissListView);
for (int i = 0; i & 20; i++) {
dataSourceList.add(&滑动删除& + i);
adapter = new ArrayAdapter&String&(this,
android.R.layout.simple_list_item_1,
android.R.id.text1, dataSourceList);
swipeDismissListView.setAdapter(adapter);
swipeDismissListView.setOnDismissCallback(new OnDismissCallback() {
public void onDismiss(int dismissPosition) {
adapter.remove(adapter.getItem(dismissPosition));
swipeDismissListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView&?& parent, View view,
int position, long id) {
Toast.makeText(SwipeActivity.this, adapter.getItem(position), Toast.LENGTH_SHORT).show();
所有的代码都已经编写完毕了,接下来就是运行工程,看看具体的效果是不是我们想要的好了,今天的讲解到这里结束了,有了NineOldAndroids我们可以在2.x的手机上面实现许多复杂的动画效果,文章也介绍了关于开源库NineOldAndroids使用的一些知识,文章有点长,希望读者还是先将文章看下,然后自己看看能不能自己实现出来,有什么不明白的地方请在下面留言,我会为大家解答的!ps: 下载源码的时候运行出错,是因为我加入了NineOldAndroids的Jar包,然后又加入了NineOldAndroids工程库,主要是我写DEMO的时候为了方便看源码就导入了NineOldAndroids工程库,大家删除一个JAR包或者NineOldAndroids工程库&就能解决了
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:992439次
积分:11141
积分:11141
排名:第404名
原创:58篇
转载:15篇
评论:2529条
Android 技术讨论群
我的联系方式
文章:16篇
阅读:197788
(1)(1)(1)(1)(1)(3)(4)(4)(2)(2)(5)(6)(10)(8)(15)(4)(2)(1)(2)

我要回帖

更多关于 如何删掉word空白页 的文章

 

随机推荐