android实现上下左右滑动界面布局
本文实例为大家分享了android实现滑动界面布局的具体代码,供大家参考,具体内容如下
1.我使用的是ScrollView嵌套HorizontalScrollView让ScrollView负责上下滑动HorizontalScrollView负责左右滑动
2.以下代码提供了思路和完成手段,请根据具体业务去进行修改,我试过使用recyclerview进行自定义,发现一旦有了复杂业务之后会掉帧卡顿所以使用了这种方法
XML布局
mainAvtivity的代码
packagetest.smartonet.com.myapplication;
importandroid.annotation.SuppressLint;
importandroid.content.Context;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.support.v7.widget.LinearLayoutManager;
importandroid.support.v7.widget.RecyclerView;
importandroid.util.AttributeSet;
importandroid.util.Log;
importandroid.view.LayoutInflater;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.HorizontalScrollView;
importandroid.widget.LinearLayout;
importandroid.widget.ScrollView;
importandroid.widget.TextView;
importandroid.widget.Toast;
importorg.w3c.dom.Text;
importjava.lang.reflect.Array;
importjava.util.ArrayList;
importjava.util.List;
/**
*zhaohancreat2019/3/6
*/
publicclassMainActivityextendsAppCompatActivity{
StringTAG="主程序";
floatmPosX;
floatmPosY;
floatmCurPosX;
floatmCurPosY;
intoffset=10;//偏移量
intfriction=10;//摩擦力
finalListlist=newArrayList();
@SuppressLint("ClickableViewAccessibility")
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
finalPagerScrollViewscrollView=findViewById(R.id.main);
list.add((HorizontalScrollView)findViewById(R.id.hor));
list.add((HorizontalScrollView)findViewById(R.id.hor1));
list.add((HorizontalScrollView)findViewById(R.id.hor2));
list.add((HorizontalScrollView)findViewById(R.id.hor3));
list.add((HorizontalScrollView)findViewById(R.id.hor4));
list.add((HorizontalScrollView)findViewById(R.id.hor5));
list.add((HorizontalScrollView)findViewById(R.id.hor6));
for(HorizontalScrollViewhorizontalScrollView:list){
horizontalScrollView.setOnTouchListener(newView.OnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
mPosX=event.getX();
mPosY=event.getY();
Log.w(TAG,mPosY+"");
break;
caseMotionEvent.ACTION_MOVE:
mCurPosX=event.getX();
mCurPosY=event.getY();
caseMotionEvent.ACTION_UP:
if(mCurPosX-mPosX>0&&(Math.abs(mCurPosX-mPosX)>offset)){
intspeed=10;//速度
intdistance=20;//滑动距离
if((Math.abs(mCurPosX-mPosX))>50){
speed=(int)Math.abs(mCurPosX-mPosX)/friction;
distance=(int)Math.abs(mCurPosX-mPosX)/3;//滑动距离
}
//向右滑動
Log.w(TAG,"向右滑动了!");
while(distance>0){
distance=distance-speed;
for(HorizontalScrollViewhorizontalScrollView:list){
horizontalScrollView.smoothScrollBy(distance,0);
}
}
returntrue;//true为屏蔽范围内的其他滑动监听
}elseif(mCurPosX-mPosX<0&&(Math.abs(mCurPosX-mPosX)>offset)){
intspeed=10;//速度
intdistance=20;//滑动距离
if((Math.abs(mCurPosX-mPosX))>50){
speed=(int)Math.abs(mCurPosX-mPosX)/friction;
distance=(int)Math.abs(mCurPosX-mPosX)/3;//滑动距离
}
//向左滑动
Log.w(TAG,"向左滑动了!");
//改为滑动
while(distance>0){
distance=distance-speed;
for(HorizontalScrollViewhorizontalScrollView:list){
horizontalScrollView.smoothScrollBy(-distance,0);
}
}
returntrue;//true为屏蔽范围内的其他滑动监听
}
break;
}
returntrue;//true为屏蔽范围内的其他滑动监听
}
});
}
}
}
classPagerScrollViewextendsScrollView{
privatefloatxDistance,yDistance,xLast,yLast;
publicPagerScrollView(Contextcontext){
super(context);
}
publicPagerScrollView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
publicPagerScrollView(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
}
@Override
publicbooleanonInterceptTouchEvent(MotionEventev){
switch(ev.getAction()){
caseMotionEvent.ACTION_DOWN:
xDistance=yDistance=0f;
xLast=ev.getX();
yLast=ev.getY();
break;
caseMotionEvent.ACTION_MOVE:
finalfloatcurX=ev.getX();
finalfloatcurY=ev.getY();
xDistance+=Math.abs(curX-xLast);
yDistance+=Math.abs(curY-yLast);
xLast=curX;
yLast=curY;
/**
*X轴滑动距离大于Y轴滑动距离,也就是用户横向滑动时,返回false,ScrollView不处理这次事件,
*让子控件中的TouchEvent去处理,所以横向滑动的事件交由ViewPager处理,
*ScrollView只处理纵向滑动事件
*/
if(xDistance>yDistance){
returnfalse;
}
}
returnsuper.onInterceptTouchEvent(ev);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。