android 12给月滑动切换,Android 顶部滑动切换实现(一)

本文详细介绍了如何在Android应用中实现类似微信底部导航的切换效果。通过布局文件、适配器填充、点击事件监听以及GestureDetector手势检测来实现滑动切换。主要方法包括getTab()用于动态添加切换按钮,setSelector()设置选中状态,并通过滑动监听处理页面间的切换。此外,还涉及了自定义适配器和接口回调更新数据。
摘要由CSDN通过智能技术生成

先看效果图,在导航栏下面分类的两个切换按钮,页面滑动也能像微信底部导航一样实现跳转。

0818b9ca8b590ca3270a3433284dd417.png

下面看主要代码。

布局文件。

这里没有包含导航条,txlTabs就是添加切换按钮的布局。下面的是一个无结果显示页面和listVew。

/** * 适配器显示 */

private void setAdapter() {

if (!Validators.isEmpty(typeList)) {

int type = typeList.get(0).getOwnerType();

if (type == UserType.TEACHER.getValue()) {

List headTeacherFirst = headTeacherFirst(typeList.get(0).getUserList());

getBaseMenuDtoList(headTeacherFirst);

}

else {

getBaseMenuDtoList(typeList.get(0).getUserList());

}

}

else {

getBaseMenuDtoList(new ArrayList());

}

getTab(typeList);

setSelector(0);

addressAdapter = new MyClassMemberAdapter(MyClassMemberActivity.this, baseMenuDtoList, getLoginedUser()

.getUserId());

addressAdapter.setPhotoAreaLister(new Callback2() {

@Override

public void callback(Object... params) {

final ActivityMenuDto dto = (ActivityMenuDto) params[0];

final String isAdd = (String) params[1];

if (isAdd.equals(Constants.OK)) {

selectedIds.add(dto.getUser().getUserId());

} else if (isAdd.equals(Constants.ZERO)) {

selectedIds.remove(dto.getUser().getUserId());

}

// addressAdapter.notifyDataSetChanged();

}

});

addressListView.setAdapter(addressAdapter);

}

这个方法主要就是用来填充适配器的,getBaseMenuDtoList()用来封装成一个转换的对象。适配器的构造方法里实现了一个接口。回到文章主题其他不多说,这里主要看

getTab(typeList);

setSelector(0);

这两个方法,图片上的效果就是这两个方法实现的。

/** * 获得切换页 * */

private void getTab(final List typeList) {

for (int i = 0; i < typeList.size(); i++) {

if (typeList.get(i).getOwnerType() == UserType.TEACHER.getValue()

|| typeList.get(i).getOwnerType() == UserType.STUDENT.getValue()) {

RelativeLayout tabLayout = (RelativeLayout) LayoutInflater.from(MyClassMemberActivity.this).inflate(

R.layout.my_class_member_tab_item, null);

final TextView tabName = (TextView) tabLayout.findViewById(R.id.tabTextView);

final ImageView imageView = (ImageView) tabLayout.findViewById(R.id.imageView);

View line = tabLayout.findViewById(R.id.line);

if (i == typeList.size() - 1) {

line.setVisibility(View.GONE);

}

tabName.setText(typeList.get(i).getOwnerName());

if (typeList.get(i).getOwnerType() == UserType.TEACHER.getValue()) {

imageView.setImageResource(R.drawable.icon_class_tea);

}

else {

imageView.setImageResource(R.drawable.icon_class_stu);

}

final int id = i;

tabLayout.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

setSelector(id);

addressAdapter.notifyDataSetChanged(baseMenuDtoList);

}

});

txlTabs.addView(tabLayout);

tabLayout.getLayoutParams().width = (DisplayUtils.getDisplayMetrics(MyClassMemberActivity.this).widthPixels) / 2;

imageViews.add(imageView);

textViews.add(tabName);

}

}

}

这里动态根据类型给txlTabs添加切换按钮(每个包括背景和文字底部说明两部分)和点击事件。

R.layout.my_class_member_tab_item:

就是一个添加的tab布局效果:

0818b9ca8b590ca3270a3433284dd417.png

下面看下setSelector(int id)方法,该方法主要用来改变选中和不选中的背景。

/*** * 选中效果 */

public void setSelector(int id) {

position = id;

selectedIds.clear();

for (int i = 0; i < typeList.size(); i++) {

if (id == i) {

imageViews.get(i).setSelected(true);

textViews.get(i).setTextColor(getResources().getColor(R.color.color_head_bg));

int type = typeList.get(id).getOwnerType();

removeUserTypeVal = type;

if (type == UserType.TEACHER.getValue()) {

List headTeacherFirst = headTeacherFirst(typeList.get(id).getUserList());

getBaseMenuDtoList(headTeacherFirst);

}

else {

getBaseMenuDtoList(typeList.get(id).getUserList());

}

}

else {

imageViews.get(i).setSelected(false);

textViews.get(i).setTextColor(getResources().getColor(R.color.color_black_text));

}

}

}

滑动切换主要通过GestureDetector实现。

mGestureDetector = new GestureDetector(new SimpleOnGestureListener() {

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

float x = e2.getX() - e1.getX();

float y = e2.getY() - e1.getY();

float x_limit = 20;

float x_abs = Math.abs(x);

float y_abs = Math.abs(y);

if (x_abs >= y_abs) {

if (x > x_limit || x < -x_limit) {

if (x > 0) {

// right

if (position <= 2 && position > 0) {

position--;

}

else if (position == 0) {

position = 2;

}

setSelector(position);

}

else if (x <= 0) {

// left

if (position < 2) {

position++;

}

else if (position == 2) {

position = 0;

}

setSelector(position);

}

}

}

if (addressAdapter != null) {

addressAdapter.notifyDataSetChanged(baseMenuDtoList);

}

return true;

}

})

并在dispatchTouchEvent中分发。

@Override

public boolean dispatchTouchEvent(MotionEvent event) {

if (mGestureDetector.onTouchEvent(event)) {

event.setAction(MotionEvent.ACTION_CANCEL);

}

return super.dispatchTouchEvent(event);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值