- 浏览: 2205200 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
运行效果:
main.xml
MainActivity.java
ScrollLayout.java
main.xml
<?xml version="1.0" encoding="utf-8"?> <com.cn.ScrollLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ScrollLayoutTest" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:background="#FF00" android:layout_width="fill_parent" android:layout_height="fill_parent"></LinearLayout> <FrameLayout android:background="#F00F" android:layout_width="fill_parent" android:layout_height="fill_parent"> </FrameLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button2" /> </LinearLayout> </com.cn.ScrollLayout>
MainActivity.java
package com.cn; import android.app.Activity; import android.os.Bundle; /** * * <p> * Title: MainActivity.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2011-10-13 * </p> * * @author 丸子 * @version 0.0.1 */ public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
ScrollLayout.java
package com.cn; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.Scroller; /** * * <p> * Title: ScrollLayout.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2011-10-13 * </p> * * @author 丸子 * @version 0.0.1 */ public class ScrollLayout extends ViewGroup { private static final String TAG = "ScrollLayout"; private Scroller mScroller; private VelocityTracker mVelocityTracker; private int mCurScreen; private int mDefaultScreen = 0; private static final int TOUCH_STATE_REST = 0; private static final int TOUCH_STATE_SCROLLING = 1; private static final int SNAP_VELOCITY = 600; private int mTouchState = TOUCH_STATE_REST; private int mTouchSlop; private float mLastMotionX; private float mLastMotionY; public ScrollLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ScrollLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mScroller = new Scroller(context); mCurScreen = mDefaultScreen; mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (changed) { int childLeft = 0; final int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { final View childView = getChildAt(i); if (childView.getVisibility() != View.GONE) { final int childWidth = childView.getMeasuredWidth(); childView.layout(childLeft, 0, childLeft + childWidth, childView.getMeasuredHeight()); childLeft += childWidth; } } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Log.e(TAG, "onMeasure"); super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int width = MeasureSpec.getSize(widthMeasureSpec); final int widthMode = MeasureSpec.getMode(widthMeasureSpec); if (widthMode != MeasureSpec.EXACTLY) { throw new IllegalStateException( "ScrollLayout only canmCurScreen run at EXACTLY mode!"); } final int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (heightMode != MeasureSpec.EXACTLY) { throw new IllegalStateException( "ScrollLayout only can run at EXACTLY mode!"); } // The children are given the same width and height as the scrollLayout final int count = getChildCount(); for (int i = 0; i < count; i++) { getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec); } // Log.e(TAG, "moving to screen "+mCurScreen); scrollTo(mCurScreen * width, 0); } /** * * According to the position of current layout * * scroll to the destination page. */ public void snapToDestination() { final int screenWidth = getWidth(); final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth; snapToScreen(destScreen); } public void snapToScreen(int whichScreen) { // get the valid layout page whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1)); if (getScrollX() != (whichScreen * getWidth())) { final int delta = whichScreen * getWidth() - getScrollX(); mScroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2); mCurScreen = whichScreen; invalidate(); // Redraw the layout } } public void setToScreen(int whichScreen) { whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1)); mCurScreen = whichScreen; scrollTo(whichScreen * getWidth(), 0); } public int getCurScreen() { return mCurScreen; } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } } @Override public boolean onTouchEvent(MotionEvent event) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(event); final int action = event.getAction(); final float x = event.getX(); final float y = event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: Log.e(TAG, "event down!"); if (!mScroller.isFinished()) { mScroller.abortAnimation(); } mLastMotionX = x; break; case MotionEvent.ACTION_MOVE: int deltaX = (int) (mLastMotionX - x); mLastMotionX = x; scrollBy(deltaX, 0); break; case MotionEvent.ACTION_UP: Log.e(TAG, "event : up"); // if (mTouchState == TOUCH_STATE_SCROLLING) { final VelocityTracker velocityTracker = mVelocityTracker; velocityTracker.computeCurrentVelocity(1000); int velocityX = (int) velocityTracker.getXVelocity(); Log.e(TAG, "velocityX:" + velocityX); if (velocityX > SNAP_VELOCITY && mCurScreen > 0) { // Fling enough to move left Log.e(TAG, "snap left"); snapToScreen(mCurScreen - 1); } else if (velocityX < -SNAP_VELOCITY && mCurScreen < getChildCount() - 1) { // Fling enough to move right Log.e(TAG, "snap right"); snapToScreen(mCurScreen + 1); } else { snapToDestination(); } // if (velocityX > SNAP_VELOCITY && mCurScreen > 0) { // // // Fling enough to move left // // Log.e(TAG, "snap left"); // if (mCurScreen > getChildCount() - 1) { // View v1 = getChildAt(0); // View v2 = getChildAt(1); // View v3 = getChildAt(2); // // } // snapToScreen(mCurScreen - 1); // // } else if (velocityX < -SNAP_VELOCITY // // && mCurScreen < getChildCount() - 1) { // // // Fling enough to move right // // Log.e(TAG, "snap right"); // // snapToScreen(mCurScreen + 1); // // } else { // // snapToDestination(); // // } // // if (mVelocityTracker != null) { // // mVelocityTracker.recycle(); // // mVelocityTracker = null; // // } // } mTouchState = TOUCH_STATE_REST; break; case MotionEvent.ACTION_CANCEL: mTouchState = TOUCH_STATE_REST; break; } return true; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.e(TAG, "onInterceptTouchEvent-slop:" + mTouchSlop + "; action = " + ev.getAction()); final int action = ev.getAction(); if ((action == MotionEvent.ACTION_MOVE) && (mTouchState != TOUCH_STATE_REST)) { Log.e(TAG, "onInterceptTouchEvent-action:" + action); return true; } final float x = ev.getX(); final float y = ev.getY(); switch (action) { case MotionEvent.ACTION_MOVE: final int xDiff = (int) Math.abs(mLastMotionX - x); Log.e(TAG, "onInterceptTouchEvent-move: xDiff = " + xDiff + "; mLastMotionX = " + mLastMotionX); if (xDiff > mTouchSlop) { mTouchState = TOUCH_STATE_SCROLLING; } break; case MotionEvent.ACTION_DOWN: mLastMotionX = x; mLastMotionY = y; Log.e(TAG, "onInterceptTouchEvent-down: x = " + x + "; y = " + y); mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING; break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: Log.e(TAG, "onInterceptTouchEvent-up: mLastMotionX = " + mLastMotionX); mTouchState = TOUCH_STATE_REST; break; } return mTouchState != TOUCH_STATE_REST; } }
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 636本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1111颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 1005从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1181Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 1020Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 848前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 937监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 808在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 979最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1344##MediaQuery MediaQuery.of(con ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 1143当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 793setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1528问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 781底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1792点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1384import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2338TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1567一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 880Flutter最近很火,我抽出了一点时间对Flutter进行了 ... -
关于android O 上 NotificationChannel 的一些注意事项
2019-07-04 11:47 942最近在适配android O,遇到个问题,应用中原本有设置界面 ...
相关推荐
本实例将深入探讨如何在Android应用中创建一个可以左右滑动的界面,类似于手机桌面的启动器(Launcher)。 首先,我们需要了解Android中的ViewPager组件。ViewPager是Android SDK提供的一种用于展示可滑动页面的...
首先,Android界面的左右滑动切换通常是通过`ViewPager`组件实现的,它允许用户通过横向滑动来浏览多个页面。如果我们想要禁止这种行为,我们需要对`ViewPager`进行定制。以下是一种可能的方法: 1. **自定义...
本项目“Android_Launcher桌面循环”着重于实现一个创新的功能:Workspace的循环滑动。这意味着用户可以无限制地向左或向右滑动桌面,而不会到达尽头,而是会回到桌面的另一端,从而提供更加流畅的用户体验。 首先...
Android 2.2的Launcher支持滑动操作,例如滑动切换屏幕、长按拖动图标等。这些手势的处理在`com.android.launcher2.GestureController`中实现,通过监听MotionEvent来识别和响应用户操作。 5. **启动器的启动流程*...
这份源码提供了一个深入理解Android桌面应用开发,特别是滑动效果实现的实例。 首先,我们来看看Android Launcher的基本结构。Launcher通常由以下几个关键组件组成: 1. **主Activity**: 这是Launcher的核心,它...
ViewPager允许用户左右滑动浏览多个页面,常用于实现类似轮播图或应用抽屉的效果。它通过PagerAdapter与数据源关联,并通过OnPageChangeListener监听页面滑动事件。 3. **自定义ViewPager** 为了实现特定的桌面...
这份"Android应用源码之Android Launcher 桌面分页滑动代码"是一个针对Android Launcher的源码示例,非常适合进行毕业设计学习。通过深入理解这份代码,你可以了解到Android桌面启动器的实现机制,尤其是分页滑动的...
在Android系统中,Launcher是用户界面的核心组成部分,它负责展示应用程序的快捷方式和主屏幕小部件,让用户体验到个性化和便捷的操作。而SlidingDrawer组件是Android SDK提供的一种交互控件,它允许开发者在界面中...
在Android开发中,实现左右滑动的效果,通常用于创建类似手机启动器的界面,这种界面允许用户通过左右滑动屏幕来浏览不同的应用列表或者页面。本文将深入探讨如何在Android中构建这样的功能,并重点关注`GridView`...
这个压缩包提供的"Android Launcher 桌面分页滑动代码"是一个适用于学生毕业设计的学习资源,旨在帮助初学者理解Android应用开发中的动态加载和页面滑动技术。 首先,我们要了解Android Launcher的基本架构。一个...
Android Launcher源码全面分析涉及了Android桌面启动器(Launcher)的核心功能实现,包括界面配置、图标及壁纸调整、启动和初始化流程、以及一些高级特性如HotSeat和页面滑动处理等。接下来将根据给出的信息点,详细...
在Android开发中,`ViewPager`是一个非常常用的组件,它允许用户通过水平滑动来浏览多个页面,这种效果常被用于应用启动器(launcher)或Tab切换等场景。本篇文章将详细探讨如何使用`ViewPager`来实现类似启动器的...
《Android系统Launcher2源码深度解析》 在Android操作系统中,Launcher是用户界面的核心组成部分,它作为系统的桌面,负责展示应用程序图标、小部件以及其他启动器功能。本文将深入探讨"android系统Launcher2"的...
在Android开发中,ViewPager是一个非常重要的组件,常用于实现页面间的滑动切换效果,比如在应用启动器(launcher)中,用户通常会通过左右滑动来浏览不同的屏幕。本篇文章将详细探讨如何利用ViewPager实现类似...
4. **Android UI 设计**: Launcher2 的布局涉及到Android的布局管理器如LinearLayout、RelativeLayout和GridView等,是学习Android UI设计的好实例。 5. **Android权限管理**: 研究AndroidManifest.xml文件,了解每...
总的来说,“android launcher demo”项目涵盖了Android UI设计、数据绑定、事件处理、自定义组件以及系统服务等多个方面的知识,是学习和理解Android启动器工作原理的好实例。通过实践这个项目,开发者可以更好地...
在Android开发中,自定义Launcher是一项常见的需求,它允许开发者为用户提供独特的启动界面,从而提升应用的用户体验。"android-launcher_custome"这个项目显然关注的是如何创建一个自定义的启动器,特别是涉及到...
在Android开发中,ViewPager是一个非常重要的组件,常用于创建滑动页面的效果,比如在应用启动器(Launcher)中常见的左右滑动切换应用页签。本教程将深入探讨如何利用ViewPager来实现类似启动器的左右拖动效果,并...
综上所述,"android launcher"是一个关键的Android组件,而MTLauncher作为一个自定义启动器实例,可能包含了各种创新特性和深度定制选项,旨在提升用户的使用体验和个性化程度。了解其工作原理和开发过程,对于...