FolderGroup这个名字是我自己想的,意思一目了然,那到到啥是FolderGroup呢?
来看这种效果:
自从某桌面第一次尝试这种文件夹的交互方式之后,马上就被抄袭的一塌糊涂。对Launcher又了解的人都知道,Worksapce的左滑和右滑效果是通过重写了ViewGroup来实现的,单单这个类就将近4k行,系统的LinearLayout也不过才3k多。ViewPager也作为一个左滑右滑的框架,并且用起来很简单,Launcher中的整体数据的更新,删除,增加已经优化的很好了,所以,我们自己重新封装一个UI层来对文件夹的FolderGroup交互来做一个实现。
LauncherModel中有一个静态的HashMap,该map中装了所有的文件夹数据。
static final HashMap<Long, FolderInfo> sBgFolders = new HashMap<Long, FolderInfo>();
对于把数据填充的ViewPager中直接使用ViewPager或者封装一下再使用就不多介绍了,主要介绍指示器效果如何实现。
我们分析一下:指示器可以左右滚动,内部的标签装的文本,可以滚动直接用的就是ScrollView了。
1.继承HorizontalScrollView.java
2.内部整个控件用LinearLayout
3.LinearLayout中装TextView
4.左右滑动ViewPager时在onScroll方法中做处理去改变指示器
当滑动到结尾时:
FolderGroupIndicator.java指示器主要类,实现效果的时候我把文件夹的名字写成死的了,使用的时候可以传值过去。字的变大变小是在监听器中完成的。
public class FolderGroupIndicator extends HorizontalScrollView implements OnPageChangeListener, OnClickListener {
private LinearLayout mContainer;
private LinearLayout.LayoutParams defaultTabLayoutParams, expandedTabLayoutParams;
private FolderGroup mGroup;
private int mScrollOffset = 52;
private int mLastScrollX = 0;
private int mCurrentPosition;
private float mCurrentPositionOffset = 0f;
int a = 1;
public FolderGroupIndicator(Context context, AttributeSet attrs) {
super(context, attrs);
setFillViewport(true);
setWillNotDraw(false);
mContainer = new LinearLayout(getContext());
mContainer.setOrientation(LinearLayout.HORIZONTAL);
mContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
addView(mContainer);
defaultTabLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
expandedTabLayoutParams = new LinearLayout.LayoutParams(getContext().getResources().getDisplayMetrics().widthPixels,
LayoutParams.MATCH_PARENT);//相当于屏幕宽的一个空View足够滚动了。
setIndicator(new String[] { "文件夹", "新建文件夹", "工具" });//死的数据,文件夹没有名字,我只好写成死的来看效果
}
public void setIndicator(String[] title) {
mContainer.removeAllViews();
for (int i = 0; i < title.length; i++) {
addChildView(title[i], i);
}
// 滚动效果偏移量不足,最后添加一个空的TextView填充
addSupplementChild();
}
private void addChildView(String title, int i) {
TextView mChild = new TextView(getContext());
mChild.setText(title);
mChild.setTextSize(20);
mChild.setGravity(Gravity.BOTTOM | Gravity.CENTER);
mChild.setPadding(100, 0, 0, 0);
mChild.setSingleLine();
mChild.setLayoutParams(defaultTabLayoutParams);
mChild.setOnClickListener(this);
mContainer.addView(mChild, i);
}
private void addSupplementChild() {
TextView mChild = new TextView(getContext());
mChild.setLayoutParams(expandedTabLayoutParams);
mContainer.addView(mChild, mContainer.getChildCount());
}
public void setFolderGroup(FolderGroup group) {
mGroup = group;
mGroup.setOnPageChangeListener(this);
}
public void updateChildTextSize(int pos, float p) {
TextView view1 = (TextView) mContainer.getChildAt(pos);
view1.setTextSize(35 - 20 * p);//计算字体大小
TextView view2 = (TextView) mContainer.getChildAt(pos + 1);
view2.setTextSize(20 * p + 15);//同上,上面的变化到最大要和下面的吻合,不然会有bug
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
int newscroll = mContainer.getChildAt(arg0).getLeft() + (int) (mContainer.getChildAt(arg0).getWidth() * arg1)-20;
scrollTo(newscroll, 0);
updateChildTextSize(arg0, arg1);
}
@Override
public void onPageSelected(int arg0) {
}
@Override
public void onClick(View v) {
TextView view = (TextView) v;
Log.i("Gmw", "view=" + view.getText().toString());
}
}
使用:
<?xml version="1.0" encoding="utf-8"?>
<com.zoe.launcher.FolderGroupLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/folder_group"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical" >
<ImageView
android:id="@+id/folder_group_blur"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/foldergroup_blur"
android:scaleType="centerCrop" />
<com.zoe.launcher.FolderGroupIndicator
android:id="@+id/folder_group_indicator"
android:layout_width="match_parent"
android:layout_height="80dp"
android:scrollbars="none" >
</com.zoe.launcher.FolderGroupIndicator>//这是指示器
<com.zoe.launcher.FolderGroup
android:id="@+id/folder_group_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/folder_group_indicator" >
</com.zoe.launcher.FolderGroup>
</com.zoe.launcher.FolderGroupLayout>
有什么不合理的地方大家可以指出来,哈哈哈...