AndroidGUI23:水平方向和垂直方向同时滚动

Android手势识别——上下左右滑动、屏幕上下左右中区域处理 立即下载

在上一篇文章中,我们讲到了使用 ScrollView 和 HorizontalScrollView ,可以在同一时刻让屏幕要么在水平方向滚动,要么在垂直方向滚动。但却不能同时在水平和垂直两个方向滚动。这篇文章的目的就是为了解决同时在两个方向滚动的问题。

 

1.     创建一个 Android Project ,将 desktop.png( 大小为 1280 x 900) ,拷贝到 res/drawable-mdpi 文件夹下。

2.     修改 Activity 所对应的 Java 代码,使之如下:

package com.pat.gui;

 

import android.app.Activity;

import android.content.Context;

import android.content.res.Configuration;

import android.content.res.Resources;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.os.Bundle;

import android.util.DisplayMetrics;

import android.view.GestureDetector;

import android.view.MotionEvent;

import android.view.View;

import android.view.ViewGroup;

import android.view.Window;

import android.view.WindowManager;

import android.view.GestureDetector.OnGestureListener;

import android.widget.Toast;

 

public class ScrollPicture extends Activity

implements

OnGestureListener

{

         private int X = 0;

         private int Y = 0;

        

         private static int scrollX = 0;

         private static int scrollY = 0;

        

         PictureView main;

         Bitmap bmp;

         Bitmap adapt;

         Resources res;

         Paint paint;

         GestureDetector gestureDetector;

         DisplayMetrics dm;

        

    @Override

    public void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        gestureDetector = new GestureDetector(this);

        paint = new Paint();

        // 获取图像

        res = getResources();

        bmp = BitmapFactory.decodeResource(res, R.drawable.desktop);

        // 获取图像的宽度和高度

        X = bmp.getWidth();

        Y = bmp.getHeight();

       

        // adapt 是 bmp 显示在屏幕上的那部分图像,见 PictureView 中的 handleScroll 方法

        adapt = Bitmap.createBitmap(bmp);

        main = new PictureView(this);

       

        // 去掉标题栏

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // 全屏显示

        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

                                                            WindowManager.LayoutParams.FLAG_FULLSCREEN);

       

        //setContentView(R.layout.main);

        setContentView(main, new ViewGroup.LayoutParams(X, Y));

       

        // 以 landscape 方式显示

        this.setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE);

       

        // 获取屏幕尺寸

        dm = new DisplayMetrics();

        getWindowManager().getDefaultDisplay().getMetrics(dm);

     }

 

    // 屏幕翻转时,要重新获取 dm 。要使 onConfigurationChanged 可以被触发,必须做到:

    // 1. 在 AndroidManifest.xml 的 Activity 标签中,增加属性 android:configChanges="orientation"

    // 2. 在 AndroidManifest.xml ,须增加权限:

    //    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>

    // 当屏幕显示有 landscape 变成 portrait ,或者有 portrait 变成 landscape 是,都会触发 onConfigurationChanged

         @Override

         public void onConfigurationChanged(Configuration newConfig)

         {

                   if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)

                   {

                            // 获取屏幕尺寸

                            dm = new DisplayMetrics();

                    getWindowManager().getDefaultDisplay().getMetrics(dm);

                    // 重新计算 adapt 。显示 desktop.png 的左上角开始,占整个屏幕尺寸大小的那部分

                    adapt = Bitmap.createBitmap(bmp, 0, 0, dm.widthPixels, dm.heightPixels);

                    // scrollX 和 scrollY 分别为在水平或者垂直方向上,滚动的像素值

                    scrollX = 0;

                    scrollY = 0;

                    // 重画

                            main.invalidate();

                    Toast.makeText(this, "(" + dm.widthPixels + ", " + dm.heightPixels + ")", Toast.LENGTH_SHORT).show();

                   }

                  

                   if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)

                   {

                            dm = new DisplayMetrics();

                    getWindowManager().getDefaultDisplay().getMetrics(dm);

                    adapt = Bitmap.createBitmap(bmp, 0, 0, dm.widthPixels, dm.heightPixels);

                    scrollX = 0;

                    scrollY = 0;

                            main.invalidate();

                    Toast.makeText(this, "(" + dm.widthPixels + ", " + dm.heightPixels + ")", Toast.LENGTH_SHORT).show();

                   }

                   // 下面这句必须存在,否则会出现异常

                   super.onConfigurationChanged(newConfig);

         }

 

         public boolean onTouchEvent(MotionEvent me)

         {

                   return gestureDetector.onTouchEvent(me);

         }

 

         public boolean onDown(MotionEvent me)

         {

                   return true;

         }

 

         public boolean onFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY)

         {

                   return true;

         }

 

         public void onLongPress(MotionEvent me)

         {

 

         }

 

         public boolean onScroll(MotionEvent me1, MotionEvent me2, float distanceX, float distanceY)

         {

                   // distanceX 和 distanceY ,分别为叫上次位置的滚动量,可以为正,也可能为负

                  main.handleScroll(distanceX, distanceY);

                   return true;

         }

 

         public void onShowPress(MotionEvent me)

         {

 

         }

 

         public boolean onSingleTapUp(MotionEvent me)

         {

                   return true;

         }

        

    class PictureView extends View

    {

                   public PictureView(Context ctx)

                   {

                            super(ctx);

                   }

 

                   // 调用 invalidate 方法时,会触发 onDraw 这个方法

                   protected void onDraw(Canvas canvas)

                   {

                            canvas.drawBitmap(adapt, 0, 0, paint);

                   }

                  

                   public void handleScroll(float distanceX, float distanceY)

                   {

                            // 修正每次滚动后的 scrollX 和 scrollY 的值

                            scrollX += distanceX;

                            scrollY += distanceY;

 

                            if(scrollX < 0)

                            {

                                     scrollX = 0;

                            }

                           

                            if(scrollX > (X - dm.widthPixels))

                            {

                                     scrollX = X - dm.widthPixels;

                            }

                           

                            if(scrollY < 0)

                            {

                                     scrollY = 0;

                            }

                           

                            if(scrollY > (Y - dm.heightPixels))

                            {

                                     scrollY = Y - dm.heightPixels;

                            }

                            // 重新获取 adapt

                            adapt = Bitmap.createBitmap(bmp, scrollX, scrollY, dm.widthPixels, dm.heightPixels);

                            // 重画

                            invalidate();

                   }

    }

}

 

3.     修改 AndroidManifest.xml ,使之如下:

<? xml version = "1.0" encoding = "utf-8" ?>

< manifest xmlns:android = "http://schemas.android.com/apk/res/android"

      package = "com.pat.gui"

      android:versionCode = "1"

      android:versionName = "1.0" >

    < application android:icon = "@drawable/icon" android:label = "@string/app_name" >

        < activity android:name = ".ScrollPicture"

                  android:label = "@string/app_name"

                  android:screenOrientation = "sensor"

                  android:configChanges = "orientation" >

            < intent-filter >

                < action android:name = "android.intent.action.MAIN" />

                < category android:name = "android.intent.category.LAUNCHER" />

            </ intent-filter >

        </ activity >

 

    </ application >

    < uses-sdk android:minSdkVersion = "7" />

    < uses-permission android:name = "android.permission.CHANGE_CONFIGURATION" />

</ manifest >

注意 AndroidManifest.xml 文件中, 3 行粗体字。其中的 android:screenOrientation="sensor" 表示,由手机的重力感应器来决定屏幕是以 landscape 或者 portrait 方式显示。

 

运行结果:


结果表明可以同时在水平和垂直方向移动图片。

 

android多种方式实现垂直滚动和水平滚动跑马灯效果 多种方式实现多种效果的自定义跑马灯效果,完整项目,注释详尽,自由度高,包括垂直滚动和水平滚动 立即下载

相关推荐

水平横向listiew,每个item都可以侧向滑动

水平横向listiew,每个item都可以侧向滑动,listview的加强版,具有listview的所有特性

<Android Studio>如何实现水平和垂直滑动滚动

然后拖入约束布局,因为我们是上下滚动,所以宽为mp,高度则为自己调节自己想要的高度(水平滚动的话则相反,高度为mp,宽度按照自己实际情况来调节),约束只用加三个就行了,要稳定在上面就加上面的约束,要稳定在下面就加下面的约束。然后将滚动控件拖入主约束布局中,上下左右加上约束,宽高直接设置为mp(match_parent后面都用mp代替)也没关系。然后就可以实现滚动了,水平滚动也是一样,不过加的是水平滚动控件HorizontalScrollView。加一个约束布局作为主布局,宽高可以直接设置为mp。

m0_73947429的博客 920

Android代码-一个Android文字轮播控件,实现了可垂直跑、可水平跑的跑马灯。

Android文字轮播控件 现在的绝大数APP特别是类似淘宝京东等这些大型APP都有文字轮播界面,实现循环轮播多个广告词等功能;这种控件俗称“跑马灯”,而TextBannerView已经实现了可垂直跑、可水平跑的跑马灯了。 效果图 Download Apk Attributes属性(TextBannerView布局文件中调用) Attributes format describe setInterval integer 文字切换时间间隔,默认3000 setAnimDuration integer 动画持续时间,默认1500 setTextSize dimension 设置文字尺寸 setTextColor color 设置文字颜色,默认黑色 setSingleLine boolean 是否为显示单行 setGravity 文字显示位置,默认左边居中;可设置left、center、right setDirection 文字轮播方向,默认水平从右到左轮播:right_to_left;还可以设置left_to_right(从左到右轮播)、bot

安卓开发 实现TextView 水平和竖直两个方向同时支持滑动

过程 ScrollView+ HorizontalScrollView套娃 注意 textView 的 android:layout_width="wrap_content" android:layout_height="wrap_content" 代码 <ScrollView android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBot

予歌的博客 1759

Android-一个看起来像TableView的RecyclerView可以同时水平和垂直滚动一个固定的标题

一个看起来像TableView的RecyclerView,可以同时水平和垂直滚动一个固定的标题

Android实现Activity水平和垂直滚动条的方法

主要介绍了Android实现Activity水平和垂直滚动条的方法,涉及Activity的ScrollView设置相关技巧,需要的朋友可以参考下

CSS3学习(四):水平和垂直方向布局

CSS3之水平方向布局和垂直方向布局

激洪的博客 1543

AMSR-2数据下载实战:从JAXA到LPRM的算法选择与效率优化

本文详细介绍了AMSR-2数据的下载实战,重点对比了JAXA与LPRM算法的差异及适用场景,并提供了高效下载方案和网络优化策略。通过实际案例和代码示例,帮助用户快速获取和处理AMSR-2数据,提升研究效率。

rl6adventurer的博客 691

android布局垂直滚动,如何在Android中以水平和垂直方式滚动表格布局

这是我如何实现它并为我工作:android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" >android:id="@+id/layout"android:layout_height="match_parent"android:scrollbars="...

weixin_39543647的博客 310

CMIP6数据处理及在气候变化、水文、生态等领域中的应用

CMIP6、Biome-BGC、生态、气候变化、气象、水文、气候模式、植被、生态模式、遥感、极端气候、降水、WRF模式、动力降尺度、RCM、大气环流模型、贝叶斯模型、、降尺度

PhyliciaFelicia的博客 1550

青藏高原冻土数据实战:如何用QGIS分析1961-2020年冻土退化趋势(附完整操作步骤)

本文详细介绍了如何使用QGIS分析1961-2020年青藏高原冻土退化趋势,包括数据准备、预处理、时空分析和模型验证等全流程操作。通过TTOP模型和Stefan方程,揭示了冻土退化的空间差异和海拔依赖性,为环境研究提供科学依据。

weixin_29276847的博客 127

android 水平垂直滚动,水平和垂直滚动的GridView Android

据我所知,您不应该将HorizontalScrollView与ListView一起使用,因为ListView负责自己的滚动。最重要的是,这样做会破坏ListView中处理大型列表的所有重要优化,因为它有效地强制ListView显示其整个项目列表,以填充HorizontalsCrollView提供的无限容器。http://developer.android.com/reference/android...

weixin_42436686的博客 298

地图坐标系大全:常用地图坐标系详解与转换指南

地图坐标系是用于描述地图上位置的数学模型。它可以用来表示地球表面上的任意一个点,使得这个点的位置可以在地图上精确定位。不同的地图坐标系采用不同的基准面和投影方式,因此会有不同的坐标系参数,不同的坐标系之间也需要进行坐标转换。在地图制图、导航、GIS等领域中,地图坐标系是一个非常重要的概念。

weixin_39888010的博客 1万+

实现textview同时具有水平滚动条和垂直滚动条

Android1.5中新加了个widget,叫做HorizontalScrollView,可以实现水平滚动,ScrollView可以实现垂直滚动,两个widget嵌套使用就可以实现水平、垂直滚动了!     android:layout_width="fill_parent

qjbagu的专栏 2447

宇树G1嵌入式软件架构及技术实现

该架构通过硬件加速(FPGA)+确定性调度(RTX5)的组合,在1ms控制周期内完成从传感器采集到43轴输出的全链路处理,相比波士顿动力系统缩短40%的着地稳定时间。,结合ARM Cortex-R5与FPGA的异构计算能力,实现43自由度1kHz实时控制。

m0_60674045的博客 4311

NVIDIA Jetson Xavier NX刷机教程

NVIDIA Jetson Xavier NX刷机教程,分别安装OS和SDK的经验分享

qq_68271367的博客 6958

OpenCV Sobel算子水平和垂直方向导数问题

sobel算子是一种常用的边缘检测算法,在各种论文或书籍中,我们常常能看到类似这样的话,被检测的对象存在大量的竖直边,所以可以采用sobel算子来找到第一个水平导数,它可以用来在图像中查找竖直边缘。 它在opencv中的原型如下: CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst...

zhangxu 2万+

Vulkan入门系列0- Vulkan与OpenGL的区别

虽然Vulkan和OpenGL都是对GPU的抽象,都能达到相同的功能,但它们的设计理念不同,可以说设计差异是非常之大,由于OpenGL从1992年到现在,已经有30多年的历史,GPU功能日新月异,与当年不可同日而语,在OpenGL保持向下兼容情况下,还要在OpenGL基础上设计一套编程接口显然是不可能的,所以推出了新编程规范Vulkan。另外在一些无窗口的应用中,Vulkan可以有选择的不创建帧缓冲区,比如在数学运算,物理模拟,处理视频流的应用中并不需要窗口,所以Vulkan支持更灵活的应用场景。

GPU全栈博主 4069

关于Scrollview怎么只让一个方向滚动的问题

这两天发现给Scrollview设置contentSize时总是会出现一些问题,楼主苦心专研终于搞懂了Scrollview的contentSize属性该怎么设置了 相信大家在用Scrollview时可能会遇到不知道怎么设置contentSize来达到自己想要的只垂直或者只水平滚动,而有的时候通过设置contentSize.y/x可以,有的时候又不行.这里有一些心得,希望能对你有所帮助 通过一些

Le_Wrynn的博客 5543

【DeepSeek开发入门】DeepSeek API 开发初体验

在人工智能蓬勃发展的时代,DeepSeek作为一款功能强大的AI大模型,为开发者提供了丰富的接口和便捷的开发体验。本文将基于DeepSeek的几个关键接口,带你快速入门,开启DeepSeek开发的探索之旅。通过本文,你已经初步了解了DeepSeek开发中几个重要接口的使用方法,包括列出模型、对话补全和查询余额接口,以及开发过程中的常见问题及解决办法。这是你踏入DeepSeek开发领域的第一步。在后续的学习中,你可以深入研究模型的参数调优,探索不同模型在各种场景下的应用,如利用模型实现更复杂的推理对话功能。

寻道AI,探索AI无限可能! 2758

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android可水平垂直滑动的列表

这里写自定义目录标题Android可水平垂直滑动的列表主要功能点实现思路合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 Android可水平垂直滑动的列表 这是第一次发布文章,因为之前一直觉得没有什么与众不同的东西值得发出来。这次由于项目需

hjwlnk的博客 755

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

文字竖直方向的滚动

*{ margin: 0; padding: 0; list-style: none; } li{ height: 60px; color: saddlebrown; font-size: 30px; line-height: 60px; padding: 0 3%; /*background: aquamarine;*/ border-radius: 50px; }

impossible1994727的博客 634

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android的布局水平与垂直显示

android:layout_gravity="center_vertical" android:layout_gravity="center_horizontal"   此可以让控件水平居中,垂直居中显示.

Joey 的工作空间~ 2684

Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系

转载请包含网址:http://blog.youkuaiyun.com/pathuang68/article/details/7351317 一、Surface Surface就是“表面”的意思。在SDK的文档中,对Surface的描述是这样的:“Handle onto a raw buffer that is being managed by the screen compositor”,翻译成中文就

玄机逸士的专栏 4万+

Pinyin4j的基本用法

1.     简单介绍 有时候,需要将汉字编程对应的拼音,以方便数据的处理。比如在Android手机应用的开发上,要查询联系人的姓名,通常都是用拼音进行查询的。比如要查询“曹孟德”,就可以输入“cmd”,即“曹孟德”三个汉字的拼音“caomengde”各字的首字母。但是怎样才能

玄机逸士的专栏 4万+
上一篇: AndroidGUI22:ScrollView/HorizontalScrollView常用技巧
下一篇: AndroidGUI24:TabHost常用技巧
pathuang68
博客等级 码龄18年 1821粉丝 194原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值