- 浏览: 200067 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xumin_minzi:
我也在使用ndk编译,ffmpeg源码放在哪个目录里面?
[原创]Android ndkr8编译 FFmpeg 0.11.1 "Happiness" -
ericchan2012:
在Dialog调用show方法之后
【原创】Android 设置Dialog的长宽和位置 -
maohualei:
求解: 我设置的时候 位置居然没有反应 dial ...
【原创】Android 设置Dialog的长宽和位置
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>
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>
发表评论
-
拖拽滑动_有3D_有循环
2012-12-11 17:38 1105android桌面拖拽3d效果 -
三星通讯录滑动出发开关
2012-12-11 17:37 866下面的代码是仿三星9300中的滑动打电话和发短信的。 -
三星通讯录滑动触发开关以及StatusBar下拉快捷键的效果
2012-10-20 17:26 13571,三星通讯录滑动触发开关 你可以参考: http://gja ... -
android水波纹效果之一
2012-09-17 22:27 1134参考: http://www.apkbus.com/archi ... -
为launcher添加一个仿Mac的dock(附源码)
2012-09-17 21:50 906之前在网上看到有篇文章:Launcher之Dock细节篇htt ... -
android桌面预览效果
2012-09-17 21:49 931主要改动的是:workspace.Java和launcher. ... -
实现通讯录的弹窗效果
2012-08-19 22:06 1670参考http://www.cnblogs.com/noTice ... -
【原创】android ViewPager控件的使用
2012-06-15 10:33 2318android4.0有个控件,就是viewpager,用来实现 ... -
【原创】android 实现气泡式listview
2012-06-14 13:33 1921iphone中短信聊天都是那种气泡式的,当然,android短 ... -
【原创】android中实现底部tabhost
2012-06-14 10:14 1713这个主要是实现底部的tabhost方式,tabhost就是有几 ... -
【原创】android中定义BaseActivity
2012-06-13 12:53 5602[size=medium] 需求: 如果一个应用程序中有许多a ... -
【原创】android进入应用程序时的动画实现
2012-06-12 11:34 1380相信玩过android应用的同学都看过进入应用程序时出现的短暂 ... -
【原创】android仿ucweb的菜单效果
2012-06-12 11:12 1110[size=medium]先看一张图 这里有几个要点 1,主 ... -
【原创】android2.3如何加入对wml的支持
2012-06-12 09:52 1264其实就是改makefile文件: 1,开启宏定义: 在exte ... -
【原创】dip与px
2012-06-11 10:38 837真正要做适配的,只有是当图片被拉抻后,是否变形了,如果变形了, ... -
【原创】Android aidl实现两个apk之间远程调用Service
2012-06-07 11:12 4885Aidl,android平台的IPC方式之一,基于系统的Ibi ... -
【转】Android-Action Bar使用方法
2012-06-06 14:49 1768转自http://disanji.net/2011/02/24 ... -
【原创】Android仿新浪微博的“更多”页面效果
2012-05-29 17:38 2200看到新浪微博那个“更多”页面的效果,感觉不错,所以拿来模仿一下 ... -
【原创】Android 设置Dialog的长宽和位置
2012-05-28 10:11 2670在Dialog调用show方法之后,加上以下代码: Wi ... -
【原创】Android 实现微博分享功能
2012-05-27 22:20 1430通过发送下面的intent: Intent intent = ...
相关推荐
这是一个示例应用程序,它使用 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 菜单...