* 快速点击多个条目的右侧按钮, 动画出现紊乱. 解决方法 : 调低动画的时间
* 快速点击同一条目的右侧按钮, 动画出现紊乱. 解决方法 : 增加标志位
* 添加或删除失败. 解决方法 : 使用界面上的View,为其增加一个新的Tag
*
主布局
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#00f" >
<!--这是一个自定义控件,实现切换的-->
<com.example.mobilesafe.view.SegmentView
android:id="@+id/activity_application_lock_sv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
app:svLeft="未加锁"
app:svRight="已加锁"
app:svSelect="left" >
</com.example.mobilesafe.view.SegmentView>
</RelativeLayout>
<TextView
android:id="@+id/activity_application_lock_title"
style="@style/NormalTextStyle"
android:layout_width="match_parent"
android:background="#D8BFD8"
android:padding="3dp"
android:text="adjvbsd" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/activity_application_lock_locklv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" >
</ListView>
<ListView
android:id="@+id/activity_application_lock_unlocklv"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
<include
android:id="@+id/activity_application_lock_loading"
layout="@layout/loading" />
</FrameLayout>
public class ActivityApplicationLock extends Activity implements onSegmentSelectedListener {
private ListView lvLock;
private ListView lvUnLock;
private View loading;
private ArrayList<LockAppbean> lockList = new ArrayList<>();
private ArrayList<LockAppbean> unLockList = new ArrayList<>();
private ArrayList<LockAppbean> datas = new ArrayList<>();
private SegmentView sv;
private boolean isLeftSelected = true;
private TextView title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_application_lock);
initView();
initEvent();
initData();
}
private void initEvent() {
sv.setOnSegmentSelectedListener(this);
}
private void initView() {
lvLock = (ListView) findViewById(R.id.activity_application_lock_locklv);
lvUnLock = (ListView) findViewById(R.id.activity_application_lock_unlocklv);
loading = findViewById(R.id.activity_application_lock_loading);
sv = (SegmentView) findViewById(R.id.activity_application_lock_sv);
title = (TextView) findViewById(R.id.activity_application_lock_title);
}
@Override
public void onLeftSelected() {
isLeftSelected = true;
if (isLeftSelected) {
title.setText("未加锁(" + unLockList.size() + ")个");
// lvUnLock.setVisibility(View.VISIBLE);
// lvLock.setVisibility(View.GONE);
flipit();
}
}
@Override
public void onRightSeleted() {
isLeftSelected = false;
if (!isLeftSelected) {
title.setText("已加锁(" + lockList.size() + ")个");
// lvUnLock.setVisibility(View.GONE);
// lvLock.setVisibility(View.VISIBLE);
flipit();
}
}
private Interpolator accelerator = new AccelerateInterpolator();
private Interpolator decelerator = new DecelerateInterpolator();
/**
* 实现两个ListView之间旋转切换的方法
* DESC : . <br/>
*/
private void flipit() {
final ListView visibleList;
final ListView invisibleList;
if (lvUnLock.getVisibility() == View.GONE) {
visibleList = lvLock;
invisibleList = lvUnLock;
} else {
invisibleList = lvLock;
visibleList = lvUnLock;
}
ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visibleList, "rotationY", 0f, 90f);
visToInvis.setDuration(300);
visToInvis.setInterpolator(accelerator);
final ObjectAnimator invisToVis =
ObjectAnimator.ofFloat(invisibleList, "rotationY", -90f, 0f);
invisToVis.setDuration(300);
invisToVis.setInterpolator(decelerator);
visToInvis.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator anim) {
visibleList.setVisibility(View.GONE);
invisToVis.start();
invisibleList.setVisibility(View.VISIBLE);
}
});
visToInvis.start();
}
private void initData() {
new Task().execute();
}
class Task extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
loading.setVisibility(View.VISIBLE);
title.setVisibility(View.GONE);
}
@Override
protected Void doInBackground(Void... params) {
SystemClock.sleep(1000);
PackageManager pm = getPackageManager();
List<ApplicationInfo> installedApplications = pm.getInstalledApplications(0);
for (ApplicationInfo info : installedApplications) {
LockAppbean appbean = new LockAppbean();
appbean.icon = pm.getApplicationIcon(info);
String packageName = info.packageName;
appbean.pkgName = packageName;
Intent intent = pm.getLaunchIntentForPackage(packageName);
if (intent == null) {
continue;
}
try {
ApplicationInfo applicationInfo = pm.getApplicationInfo(packageName, 0);
appbean.name = pm.getApplicationLabel(applicationInfo).toString();
} catch (NameNotFoundException e) {
appbean.name = packageName;
e.printStackTrace();
}
datas.add(appbean);
}
for (LockAppbean bean : datas) {
if (AppLockDAO.isLock(ActivityApplicationLock.this, bean.pkgName)) {
lockList.add(bean);
} else {
unLockList.add(bean);
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
loading.setVisibility(View.GONE);
title.setVisibility(View.VISIBLE);
if (isLeftSelected) {
title.setText("未加锁(" + unLockList.size() + ")个");
} else {
title.setText("已加锁(" + lockList.size() + ")个");
}
lockAdapter adapter = new lockAdapter();
lvUnLock.setAdapter(adapter);
// lockAdapter adapterUnlock = new lockAdapter();
lvLock.setAdapter(adapter);
}
}
/**
* 这是ListView的adapter
* @author Administrator
* @version ActivityApplicationLock
*/
class lockAdapter extends BaseAdapter {
@Override
public int getCount() {
if (isLeftSelected) {
return unLockList == null ? 0 : unLockList.size();
} else {
return lockList == null ? 0 : lockList.size();
}
}
@Override
public LockAppbean getItem(int position) {
if (isLeftSelected) {
if (unLockList != null) {
return unLockList.get(position);
} else {
return null;
}
} else {
if (lockList != null) {
return lockList.get(position);
} else {
return null;
}
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView =
View.inflate(ActivityApplicationLock.this, R.layout.app_lock_item, null);
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.app_lock_item_iv_icon);
holder.name = (TextView) convertView.findViewById(R.id.app_lock_item_tv_name);
holder.isLock = (ImageView) convertView.findViewById(R.id.app_lock_item_iv_islock);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
LockAppbean appbean = getItem(position);
holder.icon.setImageDrawable(appbean.icon);
holder.name.setText(appbean.name);
if (isLeftSelected) {
holder.isLock.setImageResource(R.drawable.unlock_app_item_selector);
} else {
holder.isLock.setImageResource(R.drawable.lock_app_item_selector);
}
final View animView = convertView;
Tag tag = (Tag) holder.isLock.getTag();
if (tag == null) {
tag = new Tag();
tag.appbean = appbean;
tag.isAnimotion = false;
holder.isLock.setTag(tag);
} else {
tag.appbean = appbean;
}
holder.isLock.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Tag tag = (Tag) holder.isLock.getTag();
if (tag.isAnimotion) {
return;
}
if (isLeftSelected) {
// 添加动画
TranslateAnimation animation =
new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, //
Animation.RELATIVE_TO_PARENT, 1f, //
Animation.RELATIVE_TO_PARENT, 0, //
Animation.RELATIVE_TO_PARENT, 0);//
animation.setDuration(400);
ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 0f, 1f, 0.2f);
scaleAnimation.setDuration(400);
AnimationSet set = new AnimationSet(false);
set.addAnimation(scaleAnimation);
set.addAnimation(animation);
set.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {
// 像数据库中插入一条数据
// unlock集合减少一条数据
// title减一
// lovk集合增加一条数据
// 更新界面
tag.isAnimotion = false;
boolean insert = AppLockDAO.insert(ActivityApplicationLock.this,
tag.appbean.pkgName);
if (insert) {
unLockList.remove(tag.appbean);
lockList.add(tag.appbean);
title.setText("已加锁(" + unLockList.size() + ")个");
notifyDataSetChanged();
} else {
ToastUtils.showToast(ActivityApplicationLock.this, "加锁失败");
}
}
});
animView.startAnimation(set);
} else {
TranslateAnimation animation =
new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0f, //
Animation.RELATIVE_TO_PARENT, -1f, //
Animation.RELATIVE_TO_PARENT, 0, //
Animation.RELATIVE_TO_PARENT, 0);//
animation.setDuration(500);
ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 0f, 1f, 0.2f);
scaleAnimation.setDuration(400);
// ScaleAnimation scaleAnimation =new
AnimationSet set = new AnimationSet(false);
set.addAnimation(animation);
set.addAnimation(scaleAnimation);
set.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {
tag.isAnimotion = false;
boolean insert = AppLockDAO.delete(ActivityApplicationLock.this,
tag.appbean.pkgName);
if (insert) {
unLockList.add(tag.appbean);
lockList.remove(tag.appbean);
title.setText("已加锁(" + lockList.size() + ")个");
notifyDataSetChanged();
} else {
ToastUtils.showToast(ActivityApplicationLock.this, "解锁失败");
}
}
});
animView.startAnimation(set);
}
}
});
return convertView;
}
class ViewHolder {
ImageView icon;
TextView name;
ImageView isLock;
}
class Tag {
LockAppbean appbean;
boolean isAnimotion;
}
}