編輯:關於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上,那麼自定義側滑菜單那裡設置背景就顯示不出來,設置到第二層就可以,不知道是腫麼回事,如果各位大師找到了,麻煩告訴小弟。
Android開發之使用MediaRecorder錄制視頻
MediaRecorder除了可以用於錄制音頻,還可用於錄制視頻。關於MediaRecorder的詳解大家可以參考《Android開發之MediaRecorder類詳解》
Android 仿淘寶、京東商品詳情頁向上拖動查看圖文詳情控件DEMO詳解
一、淘寶商品詳情頁效果我們的效果二、實現思路 使用兩個scrollView,兩個scrollView 豎直排列,通過自定義
仿知乎日報第六篇:為MainFragement加載數據
一.前面講了,MainFragment的布局就是一個ViewPager,而ViewPager的一個個頁面就是首頁,日常心理學,用戶推薦日報,電影日報,不許無聊,設計日報,
Android四大組件之Activity
?Activity?BroadcastReceiver 廣播接收者?Service 服務?ContentProvider 內容提供者Activity的繼承關系public