- 浏览: 252189 次
- 性别:
- 来自: 太原
最新评论
-
kinglo:
请问生成的文件怎么看?
Android 全局异常处理 -
yong7356:
学习一下。。。。。
Android Ant -
bzlring:
很好
Android 全局异常处理 -
M985300651:
難得一見的好教學
Android 自定义滚动视图 -
i5suoi:
thank you very much
Android 全局异常处理
Android 自定义滚动视图
- 博客分类:
- Android
MainActivity
package org.wp.activity; import android.app.Activity; import android.os.Bundle; import android.widget.ImageView; public class MainActivity extends Activity { private ImageScrollView imageScrollView = null; private PageControlView pageControlView = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imageScrollView = (ImageScrollView) this.findViewById(R.id.myImageScrollView); ImageView imageView = new ImageView(this); imageView.setImageResource(R.drawable.a1); imageScrollView.addView(imageView); imageView = new ImageView(this); imageView.setImageResource(R.drawable.a2); imageScrollView.addView(imageView); imageView = new ImageView(this); imageView.setImageResource(R.drawable.a3); imageScrollView.addView(imageView); imageView = new ImageView(this); imageView.setImageResource(R.drawable.a4); imageScrollView.addView(imageView); imageView = new ImageView(this); imageView.setImageResource(R.drawable.a5); imageScrollView.addView(imageView); imageView = new ImageView(this); imageView.setImageResource(R.drawable.a6); imageScrollView.addView(imageView); pageControlView = (PageControlView) this.findViewById(R.id.myPageControlView); /** 设置圆圈的数量 **/ pageControlView.setCount(imageScrollView.getChildCount()); /** 初始化圆圈 **/ pageControlView.generatePageControl(0); /** 设置视图切换回调函数实现 **/ imageScrollView.setScrollToScreenCallback(pageControlView); } }
ImageScrollView
package org.wp.activity; import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.Scroller; public class ImageScrollView extends ViewGroup { /** 滚动对象Scroller **/ private Scroller scroller = null; /** 手势识别对象GestureDetector **/ private GestureDetector gestureDetector = null; /** 当前屏幕索引 **/ private int currentScreenIndex = 0; /** 设置一个标志位,防止底层的onTouch事件重复处理UP事件 **/ private boolean fling = false; public ImageScrollView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { /** 设置布局,将子视图顺序横屏排列 **/ for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); child.setVisibility(View.VISIBLE); child.measure(right - left, bottom - top); child.layout(i * getWidth(), 0, (i + 1) * getWidth(), getHeight()); } } /** 初始化 **/ private void initView(final Context context) { this.scroller = new Scroller(context); this.gestureDetector = new GestureDetector(new OnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // 防止移动过最后一页 if ((distanceX > 0 && getScrollX() < getWidth() * (getChildCount() - 1)) || (distanceX < 0 && getScrollX() > 0)) {// 防止向第一页之前移动 scrollBy((int) distanceX, 0); } return true; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // 判断是否达到最小轻松速度,取绝对值的 if (Math.abs(velocityX) > ViewConfiguration.get(context) .getScaledMinimumFlingVelocity()) { if (velocityX > 0 && currentScreenIndex > 0) { fling = true; scrollToScreen(currentScreenIndex - 1); } else if (velocityX < 0 && currentScreenIndex < getChildCount() - 1) { fling = true; scrollToScreen(currentScreenIndex + 1); } } return true; } @Override public boolean onDown(MotionEvent e) { return false; } }); } /** 切换到指定屏 **/ public void scrollToScreen(int whichScreen) { if (whichScreen != currentScreenIndex && getFocusedChild() != null && getFocusedChild() == getChildAt(currentScreenIndex)) { getFocusedChild().clearFocus(); // 清除焦点 } final int delta = whichScreen * getWidth() - getScrollX(); scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2); invalidate(); currentScreenIndex = whichScreen; // 设置当前屏幕索引 if (scrollToScreenCallback != null) { // 刷新圆圈 scrollToScreenCallback.callback(currentScreenIndex); } } @Override public void computeScroll() { // 当滚动没有完成 if (scroller.computeScrollOffset()) { scrollTo(scroller.getCurrX(), 0); postInvalidate(); } } @Override public boolean onTouchEvent(MotionEvent event) { gestureDetector.onTouchEvent(event); if (event.getAction() == MotionEvent.ACTION_UP) { if (!fling) { // 当用户停止拖动 snapToDestination(); } fling = false; } return true; } /** 根据当前x坐标位置确定切换到第几屏 **/ private void snapToDestination() { scrollToScreen((getScrollX() + (getWidth() / 2)) / getWidth()); } /** 底部圆圈显示回调接口 **/ interface ScrollToScreenCallback { public void callback(int currentIndex); } /** ScrollToScreenCallback回调对象 **/ private ScrollToScreenCallback scrollToScreenCallback; /** 设置回调函数对象 **/ public void setScrollToScreenCallback(ScrollToScreenCallback scrollToScreenCallback) { this.scrollToScreenCallback = scrollToScreenCallback; } }
PageControlView
package org.wp.activity; import org.wp.activity.ImageScrollView.ScrollToScreenCallback; import android.content.Context; import android.util.AttributeSet; import android.widget.ImageView; import android.widget.LinearLayout; public class PageControlView extends LinearLayout implements ScrollToScreenCallback { /** Context对象 **/ private Context context; /** 圆圈的数量 **/ private int count; public PageControlView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } /** 回调函数 **/ @Override public void callback(int currentIndex) { generatePageControl(currentIndex); } /** 设置选中圆圈 **/ public void generatePageControl(int currentIndex) { this.removeAllViews(); for (int i = 0; i < this.count; i++) { ImageView iv = new ImageView(context); if (currentIndex == i) { iv.setImageResource(R.drawable.page_indicator_focused); } else { iv.setImageResource(R.drawable.page_indicator); } this.addView(iv); } } /** 设置圆圈数量 **/ public void setCount(int count) { this.count = count; } }
main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <org.wp.activity.ImageScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/myImageScrollView" /> <org.wp.activity.PageControlView android:layout_width="fill_parent" android:layout_height="40dip" android:layout_alignParentBottom="true" android:background="#8f00000f" android:gravity="center" android:id="@+id/myPageControlView" /> </RelativeLayout>
发表评论
-
Android Gallery3D
2011-11-28 10:51 1978MainActivity package org.wp ... -
Android 自定义Gallery
2011-10-19 21:33 2915MainActivity package org.wp.ac ... -
Android 3D图片切换
2011-10-14 17:19 3488MainActivity package org.wp.ac ... -
Android C2DM
2011-10-07 16:36 2228AndroidC2DMDemo com.google. ... -
Android Ant
2011-10-03 20:31 2884build.xml <?xml version=&qu ... -
Android 电视关机动画
2011-09-14 13:28 1825MainActivity package org.wp.ac ... -
Android 图片倒影
2011-09-09 11:07 6290MainActivity package org.wp.ac ... -
Android 绘制心形
2011-09-06 15:18 6723MyLove package org.wp.activity ... -
Android 播放音频文件
2011-09-05 16:31 5818MainActivity package org.wp.ac ... -
Android 添加自定义SurfaceView
2011-08-29 17:19 7511MainActivity package org.wp.ac ... -
Android Looper
2011-08-28 11:10 2275LooperActivity package org.wp. ... -
Android AsyncTask
2011-08-27 15:21 1563AsyncTaskActivity package org. ... -
Android TimerTask
2011-08-26 22:16 4498TimerTaskActivity package org. ... -
Android Thread
2011-08-26 13:59 5604ThreadActivity package org.wp. ... -
Android 判断程序前后台状态
2011-08-25 13:26 6886AppStatusService package org.w ... -
注册界面
2011-08-23 20:57 1186MainActivity package org.wp.ac ... -
Android 半透明(二)
2011-08-18 20:02 1498TranslucentBlurActivity packag ... -
Android 半透明(一)
2011-08-18 17:08 1658TranslucentActivity package or ... -
游戏角色在屏幕行走
2011-08-18 11:32 1239MySurfaceView package org.wp.a ... -
Android SurfaceView基础
2011-08-17 15:01 1601MySurfaceView package org.wp.a ...
相关推荐
这是一个示例应用程序,它使用 Android 旋转传感器并使用自定义视图(姿态指示器,又名“人工地平线”)显示设备旋转(俯仰/滚动)。 它显示了以下 Android 功能的正确使用: 监控旋转矢量传感器(但仅在活动可见...
在滚动自定义NestedScrollView的同时,使视图从顶部和底部隐藏的库
Android Week View是一个Android库,用于在应用程序中显示日历(周视图或日视图)。 它支持自定义样式。 产品特点 周视图日历 日视图日历 自定义样式 水平和垂直滚动 无限水平滚动 在xml预览窗口中实时预览自定义...
7.3.11 滚动视图(ScrollView)介绍与应用 7.3.12 进度条(ProgressBar)介绍与应用 7.3.13 拖动条(SeekBar)介绍与应用 7.3.14 评分组件(RatingBar)介绍与应用 7.3.15 图片视图(ImageView)介绍与应用 7.3.16 图片按钮...
它将布局从视图容器中分离出来以管理滚动视图和视图的重用。随着数据和布局的更改,使用FreeFlow能轻松地创建自定义布局和出色的动画过渡效果.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码...
在很多视频直播中都有弹幕功能,而安卓上没有简单好用的弹幕控件,本文介绍一个自定义弹幕view的demo。 效果图: 思路: 1、自定义Textitem类表示弹幕的信息 2、自定义view继承view,使用ArrayList保存每条Textitem...
该库提供了类似于iOS的过度滚动效果,几乎可以应用于所有Android本机可滚动视图。 它也可以很容易地适应自定义视图。 核心效果类是Android视图的松散,因此与实际视图类的实现分离。 这使开发人员可以将效果应用到...
android-sliderview 灵感来自自定义颜色自定义条带更改tabViews在滚动时隐藏ActionBar执照麻省理工学院
自定义控价,用于显示描述内容和标题(适用场景:图片描述),动态计算高度和固定最大高度(文字超过4行的时候,默认显示4行文字);超过高度可以通过手势滑动拉大视图,文本单独滚动
Android VegaScroll滚动布局,会随着手指滑动实现收缩隐藏与放大显示,并伴随recycler的回收与复用。代码比较简单粗暴,使用自定义的LayoutManger,内置SnapHelper。
Log.e("表格所有的滚动视图",mLockTableView.getScrollViews().toString()); Log.e("表格头部固定视图(锁列)",mLockTableView.getLockHeadView().toString()); Log.e("表格头部固定视图(不锁列)",mLockTableView....
EasyScrollerChartView :这是一个自定义标题内容,可滑动,惯性滑动,边界回弹,可单击的坐标系图,使用简单,只有一个自定义视图应有的基本素质(适用于横坐标区间平均,只关注纵坐标的场景) 原理:先通过横坐标...
博客《自定义控件三部曲视图篇(九)——RecyclerView实现滚动画廊控件》对应源码,博客地址:https://blog.csdn.net/harvic880925/article/details/86606873
强大的Android下拉刷新框支持下拉刷新、上拉加载、二级刷新、越界回弹、越界拖动,具有极强的扩展性,并集成了几十种炫酷的Header和 ...支持所有可滚动视图的越界回弹 支持 Header 和 Footer 交换混用 支持AndroidX
一个简单的滚动视图,允许添加视图到可以水平或垂直滚动的视图组。 我们使用最佳设计模式设计了库。 如果需要,它可以帮助您轻松实现和自定义。 如何安装 我们创建了一个示例项目,以帮助您如何使用我们自己的...
一个随机显示RecycylerView Item, 附带animation效果
一个自定义视图的Android库,用于基于RecyclerView实现字幕文本 特征 基于RecyclerView。 顺利,文本由RecyclerView滚动。 文本大小不受限制,因为我们的方法会将文本分成多个部分。 设置 在root build.gradle中...
未维护 该库不再被积极维护,并且不能保证与最新版本的React Native一起使用。 随意分叉仓库和/或修改代码。... 如果为false,则无法通过触摸交互滚动视图。 pinchGestureEnabled true 如果为true,则Sc
项目中集合了很多的自定义控件效果,有的是自己修改编写,有的则是来自其他开源项目,在这里做了一个记录备份,希望可以给做Android开发的同学一些帮助。 ##Views列表 ####PullToRefreshListView 经过一些修改之后的...
5.1.2 滚动视图(ScrollView) 5.1.3 网格视图(GridView) 5.1.4 列表视图(ListView) 5.1.5 切换图片(ImageSwitcher和Gallery) 5.1.6 标签切换(Tab) 5.2 通用XML属性 第6章 Android菜单和布局设计 6.1 菜单...