演练:viewpager的结合的欢迎页面和小点的距离设置计算
来源:互联网 发布:信任 知乎 编辑:程序博客网 时间:2024/05/17 23:34
效果图如下:
实现本次的欢迎效果图
我们要使用到的有:
ViewPager的实现和监听以及设置它的适配器
实现小点的距离公式计算:
两点间移动的距离=屏幕滑动百分比*间距
两点间滑动距离对应的坐标=原来的起始位置+两点间移动的距离
首先来看下welcomeAcctivity:paramas.left=两点间滑动距离对应的坐标
package example.com.chengdunews;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.RotateAnimation;import android.view.animation.ScaleAnimation;import android.widget.RelativeLayout;import android.widget.Toast;import example.com.chengdunews.activity.GuideActivity;import example.com.chengdunews.activity.MainActivity;import example.com.chengdunews.utils.CacheUtils;public class WelcomeActivity extends Activity { private RelativeLayout mactivity_welcome; public static final String START_MAIN = "start_main";//静态常量 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); mactivity_welcome= (RelativeLayout) findViewById(R.id.activity_welcome); //渐变 缩放 旋转 AlphaAnimation aa=new AlphaAnimation(0,1); aa.setDuration(800); aa.setFillAfter(true); ScaleAnimation sa=new ScaleAnimation(0,1,0,1,ScaleAnimation.RELATIVE_TO_SELF,0.5f,ScaleAnimation.RELATIVE_TO_SELF,0.5f); sa.setDuration(1000); sa.setFillAfter(true); RotateAnimation ra=new RotateAnimation(0,360,RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimation.RELATIVE_TO_SELF,0.5f); ra.setDuration(1000); ra.setFillAfter(true); AnimationSet set=new AnimationSet(false); set.addAnimation(ra); set.addAnimation(sa); set.addAnimation(aa); set.setDuration(2000); mactivity_welcome.startAnimation(set); set.setAnimationListener(new MyAnimationListener()); } class MyAnimationListener implements Animation.AnimationListener { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { boolean isStartMain= CacheUtils.getBoolean(WelcomeActivity.this, START_MAIN); if (isStartMain){// 如果进入过主页面,直接进入主页面 Intent intent=new Intent(WelcomeActivity.this,MainActivity.class); startActivity(intent); }else { //如果没有进入过主页面,进入引导页面 Intent intent=new Intent(WelcomeActivity.this,GuideActivity.class); startActivity(intent); }// 关闭welcome finish();// Toast.makeText(WelcomeActivity.this, "动画播放完成", Toast.LENGTH_SHORT).show(); } @Override public void onAnimationRepeat(Animation animation) { } }}
2.activity_welcome.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_welcome" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" tools:context="example.com.chengdunews.WelcomeActivity"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:src="@drawable/logo2" android:id="@+id/imageView" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="校园印象派" android:textSize="25sp" android:textColor="#000" android:layout_below="@+id/imageView" android:layout_centerHorizontal="true" android:layout_marginTop="46dp" android:id="@+id/textView" /></RelativeLayout>3.GuideActivitypackage example.com.chengdunews.activity;import android.app.Activity;import android.content.Intent;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.view.ViewTreeObserver;import android.widget.Button;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import java.util.ArrayList;import example.com.chengdunews.R;import example.com.chengdunews.WelcomeActivity;import example.com.chengdunews.utils.CacheUtils;import static android.content.ContentValues.TAG;public class GuideActivity extends Activity { private ViewPager viewPager; private Button btn_start_main; private LinearLayout ll_point_group; private ArrayList<ImageView> imageViews; private ImageView iv_red_point; private int leftmax;//两点的间距 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_guide); viewPager = (ViewPager) findViewById(R.id.viewpager); btn_start_main = (Button) findViewById(R.id.btn_start_main); iv_red_point= (ImageView) findViewById(R.id.iv_red_point); ll_point_group = (LinearLayout) findViewById(R.id.ll_point_group); //准备数据 int[] ids = new int[]{ R.drawable.page_02m, R.drawable.page_03m, R.drawable.page_04m, }; imageViews = new ArrayList<>(); for (int i = 0; i < ids.length; i++) { ImageView imageView = new ImageView(this); //设置背景 imageView.setBackgroundResource(ids[i]); //添加到集合中 imageViews.add(imageView); //添加点 ImageView point = new ImageView(GuideActivity.this); point.setBackgroundResource(R.drawable.point_nomal); /** * * 单位是像素 * 把单位当作dp转成对应的像素 */ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10); if (i != 0) {//不包括第0个所有的点往10px params.leftMargin = 10; } point.setLayoutParams(params); //添加到现行布局 ll_point_group.addView(point); } //设置viewpage的适配器 viewPager.setAdapter(new MyPagerAdapter()); //根据view的生命周期,当视图执行到onlayout或者onDraw的时侯,视图的高和宽,边距都有了 iv_red_point.getViewTreeObserver().addOnGlobalLayoutListener(new MyOnGlobalLayoutListener()); //得到屏幕滑动的百分比 viewPager.addOnPageChangeListener(new MyOnPageChangeListener()); //设置按钮点击 btn_start_main.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //1,保存曾经进入过主页面 CacheUtils.putBoolean(GuideActivity.this, WelcomeActivity.START_MAIN,true); //2,跳转到主页面 Intent intent=new Intent(GuideActivity.this,MainActivity.class); startActivity(intent); //3,关闭引导页面 finish(); } }); }//class类//////////////////////////////////////////////////////////////////////////////////// class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { /** * 当页面滚动了回调这个方法 * @param position 当前滑动页面的位置 * @param positionOffset 页面滑动百分比 * @param positionOffsetPixels 滑动的像素 */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //两点间移动的距离=屏幕滑动百分比*间距// int leftmargin= (int) (positionOffset*leftmax); //两点间滑动距离对应的坐标=原来的起始位置+两点间移动的距离 int leftmargin=(int) (position*leftmax+(positionOffset*leftmax)); //paramas.left=两点间滑动距离对应的坐标 RelativeLayout.LayoutParams params= (RelativeLayout.LayoutParams) iv_red_point.getLayoutParams(); params.leftMargin=leftmargin; iv_red_point.setLayoutParams(params); } /** * 当页面被选中的时侯回调这个方法 * @param position 被选中页面对应的位置 */ @Override public void onPageSelected(int position) { if (position==imageViews.size()-1){ btn_start_main.setVisibility(View.VISIBLE); }else { //其它页面 btn_start_main.setVisibility(View.GONE); } } /** * 当viewpager页面滑动状态发生变化的时侯 * @param state */ @Override public void onPageScrollStateChanged(int state) { } } class MyOnGlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener { @Override public void onGlobalLayout() { //执行不止一次 iv_red_point.getViewTreeObserver().removeOnGlobalLayoutListener(MyOnGlobalLayoutListener.this); //间距=第一个点距离左边的距离-第零个点距离左边的距离 leftmax=ll_point_group.getChildAt(1).getLeft()-ll_point_group.getChildAt(0).getLeft(); Log.e(TAG, "leftmax==:"+leftmax); } } class MyPagerAdapter extends PagerAdapter { /* 返回数据的总个数 */ @Override public int getCount() { return imageViews.size(); } /** * 作用类是listview中的getview * @param container 容器是viewpager * @param position 要创建页面的位置 * @return 返回和创建当前页面的关系值 */ @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView=imageViews.get(position); container.addView(imageView);// return super.instantiateItem(container, position);// return position; 可以返回位置 return imageView; } /** * * @param view 当前创建的视图 * @param object 上面instantiateItem返回的结果值 * @return */ @Override public boolean isViewFromObject(View view, Object object) { // return view==imageViews.get(Integer.parseInt((String) object)); 可以返回位置 return view== object; // 可以返回位置 } /** * 销毁页面 * @param container viewpager * @param position 要销毁页面的位置 * @param object 要销毁的页面 */ @Override public void destroyItem(ViewGroup container, int position, Object object) {// super.destroyItem(container, position, object); container.removeView((View) object); } }}然后是activity_guide
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_guide" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="example.com.chengdunews.activity.GuideActivity"> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:id="@+id/btn_start_main" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始体验" android:textColor="#ffffff" android:textSize="20sp" android:paddingLeft="20dp" android:background="@drawable/btn_begin" android:paddingRight="20dp" android:visibility="gone" android:layout_marginBottom="92dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="40dp" > <LinearLayout android:id="@+id/ll_point_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout> <ImageView android:id="@+id/iv_red_point" android:layout_width="10dp" android:layout_height="10dp" android:background="@drawable/point_red" /> </RelativeLayout></RelativeLayout>接下来 还有设置保存参数的CacheUtils
package example.com.chengdunews.utils;import android.content.Context;import android.content.ContextWrapper;import android.content.SharedPreferences;import example.com.chengdunews.WelcomeActivity;import example.com.chengdunews.activity.GuideActivity;/** * Created by 正 on 2017/7/31. * 缓存软件的一些参数和数据 */public class CacheUtils { public static boolean getBoolean(Context context, String key) { SharedPreferences sp=context.getSharedPreferences("yinxiangpai",context.MODE_PRIVATE); return sp.getBoolean(key,false); } /** * 保存软件的参数 * @param context * @param key * @param value */ public static void putBoolean(Context context, String key, boolean value) { SharedPreferences sp=context.getSharedPreferences("yinxiangpai",context.MODE_PRIVATE); sp.edit().putBoolean(key,value).commit(); }}
创建MainActivitypackage example.com.chengdunews.activity;import android.app.Activity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import example.com.chengdunews.R;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }}创建activity_main<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="example.com.chengdunews.activity.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我是主页面" android:layout_gravity="center" android:textSize="25dp" /></FrameLayout>以及红色的点:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:height="10dp" android:width="10dp"/> <solid android:color="#f76262"/></shape>
灰色的点:<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:height="10dp" android:width="10dp"/> <solid android:color="#a5a5a5"/></shape>
主要代码以给出 本代码是个人练习学习用的实例,有问题或疑问大家一起参考解答,谢谢!
阅读全文
1 0
- 演练:viewpager的结合的欢迎页面和小点的距离设置计算
- ViewPager和Fragment的结合
- 带有引导小点的ViewPager的实现
- ViewPager结合Fragment 实现的页面切换
- 导航页面ViewPager和欢迎界面的实现
- Viewpager + 小点点导航的具体实现
- ViewPager的小点点与触摸事件
- Activity和ViewPager的结合使用
- TabLayout和viewpager的结合使用
- android Tab和ViewPager结合的例子
- TabLayout和viewpager的完美结合
- Splash页面动态移动的小点
- ViewPager设置一次显示的页面个数
- ViewPager的欢迎界面
- 无线通信的距离计算
- 无线通讯距离的计算
- 无线通信距离的计算
- 计算字符串的距离
- Mysql 1022
- NYOJ 擅长排列的小明 酒馆浪人的博客
- Android——BroadcastReceiver NullPointerException
- Linux中怎样备份、破坏、修复MBR扇区故障
- Android 事件分发机制总结
- 演练:viewpager的结合的欢迎页面和小点的距离设置计算
- 倒角距离匹配
- java选择排序的实现
- C语言-难以发现的小错误以及易忘心得(待续)
- JAVA导出Excel表
- hdu 6069 Counting Divisors(约数个数)(2017 Multi-University Training Contest
- erlang安装
- Label的作用是什么?是怎么用的?
- 百练1745:Divisibility题解