最近在研究如何做出仿微信,仿新浪等应用,第一次安装使用的使用展示应用程序的新特性和用法。
实现功能:左右手势滑屏
底部小圆点随当前显示页跳动
浮动按钮显示。当触屏事件发生显示,否则就渐渐消失
第一种: ViewFlipper + GestureDetector
第二种: ActivityGroup + GestureDetector
第三种: ViewPager (Android3.0+)
第四种: ViewFlow (开源项目)
话不多说,先放上效果图
向右滑动,或者点击按钮向右
怎么样,是不是很心动~~~!哈哈、
实现左右滑屏是需要一个叫做ViewPager的东西。具体ViewPager怎么用我就不赘述了。(PS注意导入ViewPager的兼容包)
接下来是代码:
首先在main.xml中声明ViewPager:
- <LinearLayout
- android:id="@+id/linearLayout01"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- <android.support.v4.view.ViewPager
- android:id="@+id/guidePages"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- lt;/LinearLayout>
<LinearLayout
android:id="@+id/linearLayout01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/guidePages"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
- 和一个viewGroup放小圆点
和一个viewGroup放小圆点
- <LinearLayout
- android:id="@+id/viewGroup"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_marginBottom="40dp"
- android:gravity="center_horizontal"
- android:orientation="horizontal">
- </LinearLayout>
<LinearLayout
android:id="@+id/viewGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="40dp"
android:gravity="center_horizontal"
android:orientation="horizontal" >
</LinearLayout>
接着在item01.xml等几个xml中放置要显示的图片,因为几个都一样,就不都贴上来了。
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@drawable/feature_guide_0">
- </ImageView>
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/feature_guide_0" >
</ImageView>
接下来是核心代码:
- publicclassGuideViewActivityextendsActivity{
- privateViewPagerviewPager;
- privateArrayList<View>pageViews;
- privateImageViewimageView;
- privateImageView[]imageViews;
- //包裹滑动图片LinearLayout
- privateViewGroupmain;
- //包裹小圆点的LinearLayout
- privateViewGroupgroup;
- //左箭头按钮
- privateImageViewimageViewLeft;
- //右箭头按钮
- privateImageViewimageViewRight;
- //当前页码
- privateintcurrentIndex;
- //ImageView的alpha值
- privateintmAlpha=0;
- privatebooleanisHide;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- //将要显示的图片放到ArrayList当中,存到适配器中
- LayoutInflaterinflater=getLayoutInflater();
- pageViews=newArrayList<View>();
- pageViews.add(inflater.inflate(R.layout.item01,null));
public class GuideViewActivity extends Activity {
private ViewPager viewPager;
private ArrayList<View> pageViews;
private ImageView imageView;
private ImageView[] imageViews;
// 包裹滑动图片LinearLayout
private ViewGroup main;
// 包裹小圆点的LinearLayout
private ViewGroup group;
//左箭头按钮
private ImageView imageViewLeft;
//右箭头按钮
private ImageView imageViewRight;
//当前页码
private int currentIndex;
//ImageView的alpha值
private int mAlpha = 0;
private boolean isHide;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//将要显示的图片放到ArrayList当中,存到适配器中
LayoutInflater inflater = getLayoutInflater();
pageViews = new ArrayList<View>();
pageViews.add(inflater.inflate(R.layout.item01, null));
- ...
...
- imageViews=newImageView[pageViews.size()];
- main=(ViewGroup)inflater.inflate(R.layout.main,null);
- group=(ViewGroup)main.findViewById(R.id.viewGroup);
- viewPager=(ViewPager)main.findViewById(R.id.guidePages);
- imageViewLeft=(ImageView)main.findViewById(R.id.imageView1);
- imageViewRight=(ImageView)main.findViewById(R.id.imageView2);
- imageViewLeft.setAlpha(0);
- imageViewRight.setAlpha(0);
- //将小圆点放到imageView数组当中
- for(inti=0;i<pageViews.size();i++){
- imageView=newImageView(GuideViewActivity.this);
- imageView.setLayoutParams(newLayoutParams(20,20));
- imageView.setPadding(20,0,20,0);
- imageViews[i]=imageView;
- if(i==0){
- //默认选中第一张图片
- imageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);
- }else{
- imageViews[i].setBackgroundResource(R.drawable.page_indicator);
- }
- group.addView(imageViews[i]);
- }
- setContentView(main);
- viewPager.setAdapter(newGuidePageAdapter());
- viewPager.setOnPageChangeListener(newGuidePageChangeListener());
- imageViewLeft.setOnClickListener(newButtonListener());
- imageViewRight.setOnClickListener(newButtonListener());
- }
- //左右切换屏幕的按钮监听器
- classButtonListenerimplementsOnClickListener{
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- intshowNext=0;
- if(v.getId()==R.id.imageView1){
- System.out.println("点击了向左的按钮");
- if(currentIndex==0)
- showNext=currentIndex;
- else
- showNext=currentIndex-1;
- viewPager.setCurrentItem(showNext);
- }
- if(v.getId()==R.id.imageView2){
- System.out.println("点击了向右的按钮");
- if(currentIndex==imageViews.length)
- showNext=currentIndex;
- else
- showNext=currentIndex+1;
- viewPager.setCurrentItem(showNext);
- }
- System.out.println("当前页码:"+showNext);
- }
- }
- /**
- *设置按钮渐显效果
- */
- privateHandlermHandler=newHandler()
- {
- publicvoidhandleMessage(Messagemsg){
- if(msg.what==1&&mAlpha<255){
- //通过设置不透明度设置按钮的渐显效果
- mAlpha+=50;
- if(mAlpha>255)
- mAlpha=255;
- imageViewLeft.setAlpha(mAlpha);
- imageViewLeft.invalidate();
- imageViewRight.setAlpha(mAlpha);
- imageViewRight.invalidate();
- if(!isHide&&mAlpha<255)
- mHandler.sendEmptyMessageDelayed(1,100);
- }elseif(msg.what==0&&mAlpha>0){
- mAlpha-=3;
- if(mAlpha<0)
- mAlpha=0;
- imageViewLeft.setAlpha(mAlpha);
- imageViewLeft.invalidate();
- imageViewRight.setAlpha(mAlpha);
- imageViewRight.invalidate();
- if(isHide&&mAlpha>0)
- mHandler.sendEmptyMessageDelayed(0,2);
- }
- }
- };
- privatevoidshowImageButtonView(){
- isHide=false;
- mHandler.sendEmptyMessage(1);
- }
- privatevoidhideImageButtonView(){
- newThread(){
- publicvoidrun(){
- try{
- isHide=true;
- mHandler.sendEmptyMessage(0);
- }catch(Exceptione){
- ;
- }
- }
- }.start();
- }
- @Override
- publicbooleandispatchTouchEvent(MotionEventev){
- System.out.println("thisisdispatch");
- System.out.println("触碰屏幕");
- switch(ev.getAction()){
- caseMotionEvent.ACTION_MOVE:
- caseMotionEvent.ACTION_DOWN:
- showImageButtonView();
- break;
- caseMotionEvent.ACTION_UP:
- hideImageButtonView();
- break;
- }
- returnsuper.dispatchTouchEvent(ev);
- }
- //指引页面数据适配器,实现适配器方法
- classGuidePageAdapterextendsPagerAdapter{
- @Override
- publicintgetCount(){
- returnpageViews.size();
- }
- @Override
- publicbooleanisViewFromObject(Viewarg0,Objectarg1){
- returnarg0==arg1;
- }
- @Override
- publicintgetItemPosition(Objectobject){
- //TODOAuto-generatedmethodstub
- returnsuper.getItemPosition(object);
- }
- @Override
- publicvoiddestroyItem(Viewarg0,intarg1,Objectarg2){
- //TODOAuto-generatedmethodstub
- ((ViewPager)arg0).removeView(pageViews.get(arg1));
- }
- @Override
- publicObjectinstantiateItem(Viewarg0,intarg1){
- //TODOAuto-generatedmethodstub
- ((ViewPager)arg0).addView(pageViews.get(arg1));
- returnpageViews.get(arg1);
- }
- @Override
- publicvoidrestoreState(Parcelablearg0,ClassLoaderarg1){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicParcelablesaveState(){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- @Override
- publicvoidstartUpdate(Viewarg0){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicvoidfinishUpdate(Viewarg0){
- //TODOAuto-generatedmethodstub
- }
- }
- //指引页面更改事件监听器,左右滑动图片时候,小圆点变换显示当前图片位置
- classGuidePageChangeListenerimplementsOnPageChangeListener{
- @Override
- publicvoidonPageScrollStateChanged(intarg0){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicvoidonPageSelected(intarg0){
- currentIndex=arg0;
- for(inti=0;i<imageViews.length;i++){
- imageViews[arg0].setBackgroundResource(R.drawable.page_indicator_focused);
- if(arg0!=i){
- imageViews[i].setBackgroundResource(R.drawable.page_indicator);
- }
- }
- }
- }