編輯:關於Android編程
這裡實現兩種側滑菜單效果,第一種拖拽內容部分,菜單像是被拖出來的感覺的這種效果,第二種是拖拽內容部分,菜單在內容後面不動,感覺有一種層次感的效果,如下
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+tdrSu9bW0Ke5+7XEtPrC68q1z9bI58/Co7o8L3A+CjxwPjxwcmUgY2xhc3M9"brush:java;">package com.tenghu.customsideslip.menu.view;
import android.content.Context;
import android.os.AsyncTask;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
/**
* Created by Arvin_Li on 2014/11/19.
*/
public class ScrollSideslipMenu extends LinearLayout{
private static final int SNAP_VELOCITY=200;//速度阈值
private View mMenu;//菜單布局
private View mContent;//內容布局
private int screenWidth;//屏幕寬度
private int menuWidth;//菜單寬度
private int leftEdge;//左邊界
private int rightEdge=0;//右邊界,值恆為0
private float xUp;//手指抬起時記錄橫坐標
private float xDown;//手指按下時記錄橫坐標
private float xMove;//手指移動時記錄橫坐標
private int toRightPaddingWidth=50;//菜單完全顯示時,留給內容的寬度
private LayoutParams menuParams;//菜單布局參數
private boolean once=false;//初始化數據只加載一次
private boolean isShowMenu;//是否顯示菜單
private VelocityTracker velocityTracker;//速度跟蹤器
public ScrollSideslipMenu(Context context) {
super(context);
initWindowWidth(context);
}
public ScrollSideslipMenu(Context context, AttributeSet attrs) {
super(context, attrs);
initWindowWidth(context);
}
/**
* 初始化獲取屏幕寬度
*/
private void initWindowWidth(Context context){
WindowManager windowManager= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics displayMetrics=new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
//獲取屏幕寬度
screenWidth=displayMetrics.widthPixels;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(!once){
mMenu=this.getChildAt(0);//獲取菜單布局
mContent=this.getChildAt(1);//獲取內容布局
menuParams= (LayoutParams) mMenu.getLayoutParams();//獲取菜單布局參數
menuWidth=menuParams.width=screenWidth-toRightPaddingWidth;//設置菜單寬度
mContent.getLayoutParams().width=screenWidth;//設置內容寬度
leftEdge=-menuWidth;//左邊界
menuParams.leftMargin=leftEdge;//默認菜單不顯示
once=true;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
createVelocityTracker(event);
switch (event.getAction()){
//按下
case MotionEvent.ACTION_DOWN:
xDown=event.getRawX();//記錄按下時的橫坐標
break;
//移動
case MotionEvent.ACTION_MOVE:
//記錄移動時的橫坐標
xMove=event.getRawX();
//計算移動時與按下時的距離
int moveDistanceX= (int) (xMove-xDown);
if(isShowMenu){
menuParams.leftMargin=moveDistanceX;
}else{
menuParams.leftMargin=leftEdge+moveDistanceX;
}
if(menuParams.leftMargin
布局文件:
package com.tenghu.customsideslip.menu.view; import android.content.Context; import android.os.AsyncTask; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.WindowManager; import android.widget.RelativeLayout; /** * Created by Arvin_Li on 2014/11/19. */ public class CustomSideslipMenu extends RelativeLayout { private static final int SNAP_VELOCITY=200;//手勢滑動的速度 //屏幕寬度 private int mScreenWidth; //菜單布局 private View mMenu; //主體內容部分 private View mContent; //聲明菜單寬度 private int menuWidth; //菜單完全顯示時,留給內容部分的寬度 private int toRightPaddingWidth=50; //主體內容布局參數 private LayoutParams contentParams; //主體內容滑動到左邊緣,由菜單寬度來決定 private int leftEdge; //菜單顯示時,主體內容到右邊界,值恆為0 private int rightEdge=0; private VelocityTracker velocityTracker;//聲明速度跟蹤器 private float xDown;//記錄手指按下的橫坐標 private float xUp;//記錄手指抬起時的橫坐標 private float xMove;//記錄手指移動時的橫坐標 private boolean once=false;//只執行一次 private boolean isShowMenu=true;//是否顯示菜單 public CustomSideslipMenu(Context context) { super(context); init(context); } public CustomSideslipMenu(Context context, AttributeSet attrs) { super(context, attrs); init(context); } /** * 初始化 */ private void init(Context context){ //獲取窗口管理類 WindowManager windowManager= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); //創建DisplayMetrics DisplayMetrics displayMetrics=new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(displayMetrics); //獲取屏幕寬度 mScreenWidth=displayMetrics.widthPixels; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if(!once){ //獲取菜單布局 mMenu=this.getChildAt(0); //獲取主體內容布局 mContent=this.getChildAt(1); contentParams= (LayoutParams) mContent.getLayoutParams();//獲取主體菜單參數 //菜單寬度 menuWidth=mMenu.getLayoutParams().width=mScreenWidth-toRightPaddingWidth; //設置主體內容的寬度 mContent.getLayoutParams().width=mScreenWidth; leftEdge=menuWidth;//設置左邊界 once=true; } } @Override public boolean onTouchEvent(MotionEvent event) { //調用創建速度跟蹤器 createVelocityTracker(event); switch (event.getAction()){ //手指按下 case MotionEvent.ACTION_DOWN: xDown=event.getRawX(); break; //手指移動 case MotionEvent.ACTION_MOVE: xMove=event.getRawX(); //計算移動距離 int distanceX= (int) (xMove-xDown); if(isShowMenu){ contentParams.leftMargin=distanceX; contentParams.rightMargin=-distanceX; }else{ contentParams.leftMargin=leftEdge+distanceX; } if(contentParams.leftMargin>leftEdge){ contentParams.leftMargin=leftEdge; contentParams.rightMargin=-leftEdge; } if(contentParams.leftMargin0&&!isShowMenu){ if(upDistanceX>menuWidth/2||getScrollVelocity()>SNAP_VELOCITY){ scrollToMenu(); }else{ scrollToContent(); } }else if(upDistanceX<0&&isShowMenu){ if(Math.abs(upDistanceX)>menuWidth/2||getScrollVelocity()>SNAP_VELOCITY){ scrollToContent(); }else{ scrollToMenu(); } //手指抬起時銷毀 recycleVelocityTracker(); } break; } return true; } /** * 滾動菜單 */ private void scrollToMenu(){ new ScrollTask().execute(-30); } /** * 滾動內容 */ private void scrollToContent(){ new ScrollTask().execute(30); } /** * 獲取速度 * @return */ private int getScrollVelocity(){ velocityTracker.computeCurrentVelocity(1000); int velocity= (int) velocityTracker.getXVelocity(); return Math.abs(velocity); } /** * 銷毀速度跟蹤器 */ private void recycleVelocityTracker(){ if (null != velocityTracker) { velocityTracker.recycle(); velocityTracker = null; } } /** * 創建速度跟蹤器 */ private void createVelocityTracker(MotionEvent event){ if(null==velocityTracker){ velocityTracker=velocityTracker.obtain(); } velocityTracker.addMovement(event); } /** * 創建異步滾動任務類 */ class ScrollTask extends AsyncTask { @Override protected Integer doInBackground(Integer... params) { int leftMargin=contentParams.leftMargin; while(true){ leftMargin=leftMargin+params[0]; if(leftMargin>leftEdge){ leftMargin=leftEdge; break; } if(leftMargin
布局文件:
菜單布局文件:
這裡的菜單,可以是用ListView來布局,做測試就沒有那樣做了,所有代碼全部在這裡了,可以看出,兩種效果只是繼承了不通的布局,感覺第二種效果在設置背景時有點問題,就是在這裡如果將背景設置到第一層的LinearLayout上,那麼自定義側滑菜單那裡設置背景就顯示不出來,設置到第二層就可以,不知道是腫麼回事,如果各位大師找到了,麻煩告訴小弟。
MediaRecorder除了可以用於錄制音頻,還可用於錄制視頻。關於MediaRecorder的詳解大家可以參考《Android開發之MediaRecorder類詳解》
一、淘寶商品詳情頁效果我們的效果二、實現思路 使用兩個scrollView,兩個scrollView 豎直排列,通過自定義
一.前面講了,MainFragment的布局就是一個ViewPager,而ViewPager的一個個頁面就是首頁,日常心理學,用戶推薦日報,電影日報,不許無聊,設計日報,
?Activity?BroadcastReceiver 廣播接收者?Service 服務?ContentProvider 內容提供者Activity的繼承關系public