編輯:關於Android編程
首先要感謝各位國內外大神無私奉獻的精神
最近APP需要做一個側滑欄,查閱了一些資料後發現使用SlidingMenuS實現比較簡單,這裡做下筆記,方便以後有需要方便使用。
(1)准備資源項目:
首先去https://github.com/jfeinstein10/SlidingMenu(SlidingMenu在GitHub的下載地址)下載資源項目。然後去
https://github.com/JakeWharton/ActionBarSherlock下載ActionBarSherlock資源項目,這裡解釋一下,因為 SlidingMenu依附於另一個開源項目ActionBarSherlock,所以需要將ActionBarSherlock也下載下來。下載頁面如下圖:
下載好後分別將這2個項目導入到eclipse中:
方法:<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPiBGaWxlLSZndDtJbXBvcnQtJmd0O0V4aXN0aW5nIEFuZHJvaWQgQ29kZSBJbnRvIFdvcmtzcGFjZS0mZ3Q7U2VsZWN0IHJvb3QgZGlyZWN0b3J5PGJyIC8+DQo8aW1nIGFsdD0="這裡寫圖片描述" src="/uploadfile/Collfiles/20160513/20160513091706377.png" title="\" />
在Browse這裡選擇你存放這2個項目的地方後finish
(2)將SlidingMenu整合到自己的項目:
將這2個資源項目整合到自己的新建或已建好的項目中,在這之前要特別注意一點:上面那2個資源文件的存儲路徑要和自己的項目在同一存儲路徑,且路徑不要有中文。這裡我可能說的不太清楚,就比如你自己的項目在D->stor下,這2個資源文件你也要放在這個 目錄下。
方法就是右鍵自己的項目,選擇Properties->Android->Add->然後選擇你要添加的作為library的資源文件
在這裡選擇這2個資源文件
導入成功後應該是醬紫的:
導入後在你新建類繼承SlidingFragmentActivity類可能出現The hierarchy of the type MainActivity is inconsistent錯誤,這裡最大的可能就是因為v4包不一致,你就直接把SlidingMenu和ActionBarSherlock下的libs下的v4包換成你自己項目的v4包就可以了。
如果還有其他問題,可以參考這篇文章:
http://my.oschina.net/totemzl/blog/225266
接下來就是使用了
我這裡使用Fragment作為側滑菜單的布局容器。所以要繼承SlidingFragmentActivity
源碼在下面,這裡就先大概說一下:
首先這是我主界面的xml布局,名字為right,沒什麼好說的,就一個圖片加一個TextView
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:id="@+id/llright" android:orientation="vertical"> <imageview android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/ic_launcher"> <textview android:layout_height="wrap_content" android:layout_width="wrap_content" android:textsize="20sp" android:layout_margintop="30dp" android:layout_gravity="center" android:text="這是右邊的Fragment"> </textview></imageview></linearlayout></code>
接下來是側邊欄的布局,名字為left,一張圖片加上一個listview
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/ll" android:orientation="vertical"> <imageview android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/tiantiansifangmao"> <listview android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content"> </listview> </imageview></linearlayout> </code>
如果使用fragment,可以將側邊欄設置為一個fragment,名字為LeftList,代碼如下:
package com.cmmr.guligu;
import java.util.Arrays;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
public class LeftList extends Fragment {
private View mView;
private ListView listView;
private List mList = Arrays
.asList("個人中心", "設置", "秦夕顏", "千甄拳", "不知道","洪玄公","千夫長");
private ListAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(mView == null){
initView(inflater, container);
}
return mView;
}
private void initView(LayoutInflater inflater, ViewGroup container) {
mView = inflater.inflate(R.layout.left, container, false);
listView = (ListView) mView
.findViewById(R.id.listView1);
mAdapter = new ArrayAdapter(getActivity(),
android.R.layout.simple_list_item_1, mList);
listView.setAdapter(mAdapter);
}
}
MAinActivity:
package com.cmmr.guligu;
import android.graphics.Canvas;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.Window;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.CanvasTransformer;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;
public class MainActivity extends SlidingFragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.right);
// 設置存放側滑欄的容器的布局文件
setBehindContentView(R.layout.left_menu_frame);
// 將側滑欄的fragment類填充到側滑欄的容器的布局文件中
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
LeftList fragment = new LeftList();
transaction.replace(R.id.id_left_menu_frame, fragment);
transaction.commit();
SlidingMenu menu = getSlidingMenu();
// menu.setMode(SlidingMenu.LEFT);
// 設置觸摸模式,可以選擇全屏劃出,或者是邊緣劃出,或者是不可劃出,這裡為全屏劃出
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
// 設置側滑欄完全展開之後,距離另外一邊的距離,單位px,設置的越大,側滑欄的寬度越小
menu.setShadowWidthRes(R.dimen.shadow_width);
// 設置陰影的顏色
menu.setShadowDrawable(R.drawable.shadow);
// 設置側滑欄顯示動畫為折疊動畫
menu.setBehindCanvasTransformer(new CanvasTransformer() {
@Override
public void transformCanvas(Canvas canvas, float percentOpen) {
canvas.scale(percentOpen, 1, 0, 0);
}
});
// 設置滑動菜單視圖的寬度
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
// 設置漸入漸出效果的值。范圍是0-1.0f,設置的越大,則在側滑欄剛劃出的時候, 顏色就越暗。1.0f的時候,顏色為全黑剛劃出的時候,
menu.setFadeDegree(0.3f);
}
}
這裡要說明一下,在MainActivity中的left_menu_frame的布局文件為:
<framelayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/id_left_menu_frame" android:layout_width="match_parent" android:layout_height="match_parent"></framelayout></code>
這個是一個比較固定的寫法。
在資源文件values的dimens中添加2條:
280dp
15dp
以便在設置中方便使用。
// 設置陰影的顏色
menu.setShadowDrawable(R.drawable.shadow);
中的shadow布局如下:
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:endcolor="#ff444444" android:startcolor="#00000000"> </gradient></shape></code>
在Activity中動態添加Fragment的方法如下(這是我學習過程中截得圖o(╯□╰)o):
應該沒有別的什麼了吧,最後是效果圖(用的平板做的測試,還有我不會弄動態圖,只能弄2張圖片了,小白一個,見諒見諒)
最後在從別人那裡搜集一些常用屬性什麼的給大家供大家參考吧:
(1)雙側滑欄
我們可以通過下面的代碼實現雙側滑欄的效果
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//設置左邊的側滑欄
getSlidingMenu().setMode(SlidingMenu.LEFT_RIGHT);
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
setContentView(R.layout.content_frame);
getSupportFragmentManager().beginTransaction()
.replace(R.id.content_frame, new SampleListFragment()).commit();
//設置右邊的側滑欄
getSlidingMenu().setSecondaryMenu(R.layout.menu_frame_two);
getSlidingMenu().setSecondaryShadowDrawable(R.drawable.shadowright);
getSupportFragmentManager().beginTransaction()
.replace(R.id.menu_frame_two, new SampleListFragment())
.commit();
}
(2)設置觸摸模式
通過getSlidingMenu().setTouchModeAbove()可以設置側滑欄的觸摸模式,用下面3個常量值
SlidingMenu.TOUCHMODE_FULLSCREEN 全屏幕模式,全屏滑動都可打開
SlidingMenu.TOUCHMODE_MARGIN 側邊模式,只在屏幕側邊滑動才能打開,中心滑動不能打開
SlidingMenu.TOUCHMODE_NONE 禁止觸摸模式,不能夠通過觸摸打開,只能夠通過SlidingMenu().toggle()打開或者是關閉
(3)設置側滑欄顯示動畫
通過SlidingMenu.setBehindCanvasTransformer(CanvasTransformer);方法可以設置側滑欄的顯示動畫,參數是一個CanvasTransformer對象。下面是幾個常見的動畫的設置
折疊動畫
new CanvasTransformer() {
@Override
public void transformCanvas(Canvas canvas, float percentOpen) {
canvas.scale(percentOpen, 1, 0, 0);
}
}
放縮動畫
new CanvasTransformer() {
@Override
public void transformCanvas(Canvas canvas, float percentOpen) {
float scale = (float) (percentOpen*0.25 + 0.75);
canvas.scale(scale, scale, canvas.getWidth()/2, canvas.getHeight()/2);
}
}
上升動畫
private static Interpolator interp = new Interpolator() {
@Override
public float getInterpolation(float t) {
t -= 1.0f;
return t * t * t + 1.0f;
}
};
new CanvasTransformer() {
@Override
public void transformCanvas(Canvas canvas, float percentOpen) {
canvas.translate(0, canvas.getHeight()*(1-interp.getInterpolation(percentOpen)));
}
}
SlidingMenu 常用屬性介紹:
menu.setMode(SlidingMenu.LEFT);//設置左滑菜單
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//設置滑動的屏幕局限,該設置為全屏區域都可以滑動
menu.setShadowDrawable(R.drawable.shadow);//設置暗影
menu.setShadowWidthRes(R.dimen.shadow_width);//設置暗影的寬度
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//SlidingMenu劃出時主頁面顯示的剩余寬度
menu.setBehindWidth(400);//設置SlidingMenu菜單的寬度
menu.setFadeDegree(0.35f);//SlidingMenu滑動時的漸變程度
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);//使SlidingMenu附加在Activity上
menu.setMenu(R.layout.menu_layout);//設置menu的布局文件
menu.toggle();//動態斷定主動封閉或開啟SlidingMenu
menu.showMenu();//顯示SlidingMenu
menu.showContent();//顯示內容
menu.setOnOpenListener(onOpenListener);//slidingmenu打開
關於封閉menu有兩個,簡單的來說,對於menu close事務,一個是when,一個是after
menu.OnClosedListener(OnClosedListener);//slidingmenu封閉時事務
menu.OnClosedListener(OnClosedListener);//slidingmenu封閉後事務
最近想寫篇關於Activity啟動過程源碼分析的博客,在此之前先總結下Android中Activity必須要知道的一些基礎知識,以方便後面能看懂Activity的源碼。一
時候我們需要監聽ScroView的滑動情況,比如滑動了多少距離,是否滑到布局的頂部或者底部。可惜的是SDK並沒有相應的方法,不過倒是提供了一個 復制代碼 代碼如下:pro
老早就使用了,但是現在才寫,惰性太大,現在改現在做產品的話相信大家基本都做分享吧,一個是項目的需求需要,還有一個是可以很好的宣傳自己的產品,其他的好處根據情況而論其實每個
實際開發中,服務端返回的時間一般是時間戳的格式。這時客戶端就需要對時間戳做出處理,將時間戳轉換為標准的時間格式。 打印效果圖: 直接上代碼