三月十六日android stdio
完成了侧滑界面的布局以及相应的Java文件(理解后可以作为一个模板重复使用)
相应的Java文件如下:
package com.example.firstapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.Scroller; public class SlideMenu extends FrameLayout { private View menuView,mainView; private int menuWidth; private Scroller scroller; public SlideMenu(Context context) { super(context); init(); } public SlideMenu(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init(){ scroller = new Scroller(getContext()); } /** * 当1级子view全部加载完调用,可以用初始化子view引用 * 注意这里无法获取子view的宽高 */ @Override protected void onFinishInflate() { super.onFinishInflate(); menuView = getChildAt(0); mainView = getChildAt(1); menuWidth = menuView.getLayoutParams().width; } //使Menu也具有滑动功能 public boolean onInterceptTouchEvent(MotionEvent ev){ switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: downX = (int) ev.getX(); break; case MotionEvent.ACTION_MOVE: int deltaX = (int) (ev.getX() - downX); if (Math.abs(deltaX) > 8){ return true; } break; } return super.onInterceptTouchEvent(ev); } /** * s设置两个子view在页面上的布局 * @param l:当前子view的左边在父view的坐标系的x坐标 * @param t:当前子view的顶边在父view的坐标系的y坐标 * @param r:当前子view的宽 * @param b:当前子view的高 */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { menuView.layout(-menuWidth, 0, 0, b); mainView.layout(0, 0, r, b); } /** * 处理屏幕滑动事件 */ private int downX; public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = (int) event.getX(); break; case MotionEvent.ACTION_MOVE: int moveX = (int) event.getX(); int deltaX = moveX - downX; int newScrollX = getScrollX() - deltaX; if (newScrollX < -menuWidth) newScrollX = -menuWidth; if (newScrollX > 0) newScrollX = 0; scrollTo(newScrollX, 0); downX = moveX; break; case MotionEvent.ACTION_UP: //当滑动距离小于Menu宽度的一半时,平滑滑动到主页面 if(getScrollX()>-menuWidth/2){ closeMenu(); }else { //当滑动距离大于Menu宽度的一半时,平滑滑动到Menu页面 openMenu(); } break; } return true; } //关闭menu private void closeMenu(){ scroller.startScroll(getScrollX(),0,0-getScrollX(),0,400); invalidate(); } //打开menu private void openMenu(){ scroller.startScroll(getScrollX(),0,-menuWidth-getScrollX(),0,400); invalidate(); } /** * Scroller不主动去调用这个方法 * 而invalidate()可以调用这个方法 * invalidate->draw->computeScroll */ public void computeScroll(){ super.computeScroll(); if(scroller.computeScrollOffset()){ //返回true,表示动画没结束 scrollTo(scroller.getCurrX(),0); invalidate(); } } /** * 切换菜单的开和关 */ public void switchMenu(){ if(getScrollX()==0){ openMenu(); }else { closeMenu(); } } }
1.主activity里面利用Slidemenu作为容器放置两个布局文件。
2.view组件
3.封装类进行图片、文字、图片的组合
4.总体布局类似与qq
博主的完美的跳转写法****
1.setlistener--setOnclickListener
2.Onclick---intent(通过的是getID---对应不同的intent)**不要忘记最后的startacivity
startActivity(new Intent(当前Activity.this,要启动的Activity.class));用于启动一个新的Activity
3.onCreate里面要调用我们的setListener
具体的实现代码如下
package com.example.firstapp; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class SlideActivity extends AppCompatActivity { //声明控件 private ImageView mIvhead; private SlideMenu slideMenu; private Button mBtnStudy; private Button mBtnPlay; private Button mBtnExercise; private Button mBtnRead; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_slide); //找到控件 mIvhead = findViewById(R.id.iv_head); slideMenu = findViewById(R.id.slideMenu); mBtnStudy = findViewById(R.id.but_main_1); mBtnPlay = findViewById(R.id.but_main_2); mBtnExercise = findViewById(R.id.but_main_3); mBtnRead = findViewById(R.id.but_main_4); //实现侧滑的部分,点击加上侧滑 mIvhead.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { slideMenu.switchMenu(); } }); } private setListener(){ //新建对象 Onclick onclick = new Onclick(); //现在对每一个按钮进行setOnclicklistener; mBtnStudy.setOnClickListener(onclick);//目标方法 mBtnPlay.setOnClickListener(onclick); mBtnExercise.setOnClickListener(onclick); mBtnRead.setOnClickListener(onclick); } private class Onclick implements View.OnClickListener{ @Override public void onClick(View v) { Intent intent = null; switch (v.getId()){ case R.id.but_main_1: intent = new Intent(SlideActivity.this,StudyActivity.class); break; case R.id.but_main_2: intent = new Intent(SlideActivity.this,PlayActivity.class); break; case R.id.but_main_3: intent = new Intent(SlideActivity.this,ExerciseActivity.class); break; case R.id.but_main_4: intent = new Intent(SlideActivity.this,ReadActivity.class); break; } //执行intent这个意图 startActivity(intent); } }
****代码中的三个布局文件****
1.容器activity_slide
2.正面布局layout_main
3.侧滑菜单layout_menu
今日所写代码::