热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Androidstudio实现滑动开关

这篇文章主要为大家详细介绍了Androidstudio实现滑动开关,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

大家好,今天刚学会使用Android Studio实现滑动开关的效果,自己感觉还可以,和大家分享一下,如果觉得可以的可以拿去,然后再给我点个赞,谢谢。本人也是学Android studiok开发不久,是个菜鸟,各位大佬觉得有不好的地方,可以讨论一下,共同学习,一起进步。

实现效果

下面是代码,代码写的比较粗糙,注释没有写的很好,需要用的可以自己移植一下

package com.example.biansheng2;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.Nullable;

/**
 * 用于选择手动模式还是路线规划模式
 */
public class ModelSelectView extends View {
 Paint backPaint = new Paint();//背景画笔
 Paint facePaint = new Paint();//表面视图画笔
 Paint colorPaint1 = new Paint();//绘制红色和蓝色
 Paint colorPaint2 = new Paint();//绘制橙色
 Paint colorPaint3 = new Paint();//绘制灰色
 Paint handFOnt= new Paint();//手动控制模式字体
 Paint routeFOnt= new Paint();//路线规划模式字体

 boolean modelFlag = false;//false表示为手动控制模式,true表示为路线规划模式

 RectF mRectF1 = new RectF(150, 840, 580, 960);

 int x = 150, y = 900;//得到手指再控件上移动的坐标

 public ModelSelectView(Context context, @Nullable AttributeSet attrs) {
 super(context, attrs);
 }

 @Override
 protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 paintInit();
 canvas.drawRect(mRectF1, backPaint);
 canvas.drawCircle(150, 900, 60, backPaint);
 canvas.drawCircle(580, 900, 60, backPaint);

 if (!modelFlag){
  canvas.drawCircle(150, 900, 60, facePaint);
  canvas.drawRect(150,840,x,960,facePaint);

  //设置手动控制字体可见
  handFont.setAlpha(255);
  //设置路线规划字体不可见
  routeFont.setAlpha(0);
 }else {
  canvas.drawCircle(580, 900, 60, facePaint);
  canvas.drawRect(x,840,580,960,facePaint);

  //设置手动控制字体不可见
  handFont.setAlpha(0);
  //设置路线规划字体可见
  routeFont.setAlpha(255);
 }

 canvas.drawText("手动控制",250,915,handFont);
 canvas.drawText("路线规划",250,915,routeFont);

 canvas.drawCircle(x, y, 44, backPaint);
 canvas.drawCircle(x, y, 40, colorPaint2);
 canvas.drawCircle(x, y, 47, colorPaint3);


 }


 private void paintInit() {
 if (!modelFlag) {
  backPaint.setAntiAlias(true);
  backPaint.setColor(Color.parseColor("#ff00b5eb"));

  facePaint.setColor(Color.parseColor("#D81B60"));
  facePaint.setAntiAlias(true);


 }else {
  backPaint.setAntiAlias(true);
  backPaint.setColor(Color.parseColor("#D81B60"));

  facePaint.setColor(Color.parseColor("#ff00b5eb"));
  facePaint.setAntiAlias(true);


 }


 colorPaint2.setAntiAlias(true);
 colorPaint2.setColor(Color.parseColor("#FF6407"));

 colorPaint1.setAntiAlias(true);
 colorPaint1.setColor(Color.BLUE);

 colorPaint3.setColor(Color.WHITE);
 colorPaint3.setAntiAlias(true);
 colorPaint3.setStyle(Paint.Style.STROKE);
 colorPaint3.setStrokeWidth(5);

 Typeface fOnt= Typeface.create(Typeface.DEFAULT_BOLD,Typeface.BOLD_ITALIC);
 handFont.setTypeface(font);
 handFont.setColor(Color.WHITE);
 handFont.setAntiAlias(true);
 handFont.setTextSize(50);

 routeFont.setTypeface(font);
 routeFont.setColor(Color.WHITE);
 routeFont.setAntiAlias(true);
 routeFont.setTextSize(50);


 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
 switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:

  break;

  case MotionEvent.ACTION_MOVE:
  int getX = (int) event.getX();
  int getY = (int) event.getY();

  //判断得到的坐标是否在视图范围之内
  if (getX >= 150 && getX <= 580 && getY >= 840 && getY <= 960) {
   x = getX;
   y = 900;
  }

  break;
  case MotionEvent.ACTION_UP:
   int getX1 = (int) event.getX();
   int getY1 = (int) event.getY();
   //判断是否在控件内
   if (getY1 >= 810 && getY1 <= 990) {
    if (getX1 <= 280) {
    x = 150;
    modelFlag = false;
    } else if (getX1 >= 443) {
    x = 580;
    modelFlag = true;
    } else {
    if (!modelFlag) {
     x = 150;
     modelFlag = false;
    } else {
     x = 580;
     modelFlag = true;
    }
    }
   }
   break;
 }
 invalidate();//刷新界面
 return true;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 为了在Fragment中直接调用Activity的方法,可以通过定义一个接口并让Activity实现该接口来实现。具体步骤包括:首先在Fragment中声明一个接口,并在Activity中实现该接口。接着,在Fragment中通过类型转换检查Activity是否实现了该接口,如果实现了则调用相应的方法。这种方法不仅提高了代码的解耦性,还增强了模块间的通信效率。此外,还可以通过ViewModel或LiveData等现代Android架构组件进一步优化这一过程,以实现更加高效和可靠的通信机制。 ... [详细]
  • 深入解析 OpenCV 2 中 Mat 对象的类型、深度与步长属性
    在OpenCV 2中,`Mat`类作为核心组件,对于图像处理至关重要。本文将深入探讨`Mat`对象的类型、深度与步长属性,这些属性是理解和优化图像操作的基础。通过具体示例,我们将展示如何利用这些属性实现高效的图像缩小功能。此外,还将讨论这些属性在实际应用中的重要性和常见误区,帮助读者更好地掌握`Mat`类的使用方法。 ... [详细]
  • 解决基于XML配置的MyBatis在Spring整合中出现“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”问题的方法
    在将Spring与MyBatis进行整合时,作者遇到了“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”的问题。该问题主要出现在使用XML文件配置DAO层的情况下,而注解方式配置则未出现类似问题。作者详细分析了两个配置文件之间的差异,并最终找到了解决方案。本文将详细介绍问题的原因及解决方法,帮助读者避免类似问题的发生。 ... [详细]
  • 在 HihoCoder 1505 中,题目要求从给定的 n 个数中选取两对数,使这两对数的和相等。如果直接对所有可能的组合进行遍历,时间复杂度将达到 O(n^4),因此需要考虑优化选择过程。通过使用哈希表或其他高效的数据结构,可以显著降低时间复杂度,从而提高算法的效率。具体实现中,可以通过预处理和存储中间结果来减少重复计算,进一步提升性能。 ... [详细]
  • 在探讨如何高效处理大规模数据报表的分页展示之前,首先需要明确导致报表加载缓慢的主要原因。通常情况下,这主要是由于两个方面:一是查询条件过于宽泛,使得数据库返回的结果集包含数百万甚至更多的记录;二是前端渲染性能不足,无法高效处理大量数据。为了优化这一过程,可以从以下几个方面入手:优化查询条件,减少不必要的数据返回;采用分页查询技术,每次仅加载所需的数据;利用缓存机制,减少对数据库的频繁访问;提升前端渲染效率,使用虚拟滚动等技术提高用户体验。 ... [详细]
  • 本文深入探讨了原型模式在软件设计中的应用与实现。原型模式通过使用已有的实例作为原型来创建新对象,而不是直接通过类实例化。这种方式不仅简化了对象的创建过程,还提高了系统的灵活性和效率。具体来说,原型模式涉及一个支持克隆功能的接口或基类,子类通过实现该接口来提供具体的克隆方法,从而实现对象的快速复制。此外,文章还详细分析了原型模式的优缺点及其在实际项目中的应用场景,为开发者提供了实用的指导和建议。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 题目描述非常吸引人。每颗星星可以通过其在窗口的左下角和右上角位置构建两条扫描线,从而将问题转化为区间增减和求最大值的操作。需要注意的是,位于边界的星星不应计入结果,因此在处理时应分别对左右边界进行适当的增减调整。此外,利用线段树和离散化技术可以显著提高算法效率,确保在大规模数据下的性能表现。 ... [详细]
  • Vuex 实战进阶:构建高效笔记本应用(第二篇)
    在上一篇文章中,我们初步探讨了 Vuex 在该项目中的应用。本文将深入解析整个项目的架构设计。首先回顾 `main.js` 的内容,然后重点分析 `App.vue` 文件,其中引入了 `Toolbar.vue` 和 `NodeList.vue` 组件,详细说明它们在应用中的作用和交互方式。通过这些组件的协同工作,我们将展示如何构建一个高效且响应迅速的笔记本应用。 ... [详细]
  • 本文将详细介绍在Android应用中添加自定义返回按钮的方法,帮助开发者更好地理解和实现这一功能。通过具体的代码示例和步骤说明,本文旨在为初学者提供清晰的指导,确保他们在开发过程中能够顺利集成返回按钮,提升用户体验。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 新年伊始,正是学习的最佳时机。本文全面解析了CK1957-Zookeeper的核心概念与实践技巧,旨在帮助初学者快速掌握这一深度学习工具。通过详细的理论讲解和实际操作示例,读者可以更好地理解Zookeeper的工作原理及其在分布式系统中的应用。无论是新手还是有一定基础的学习者,都能从中受益匪浅。 ... [详细]
  • 探究Oracle数据库字符集编码的详细方法与实践
    本文深入探讨了Oracle数据库字符集编码的详细方法与实践。首先,通过执行 `SELECT USERENV('language') FROM DUAL;` 查询服务端字符集编码。其次,通过在注册表中搜索 `NLS_LANG` 参数来查看客户端字符集编码。此外,文章还介绍了如何在不同场景下正确配置和转换字符集,以确保数据的一致性和完整性。 ... [详细]
  • 本文深入探讨了在Android应用开发中常见的相机连接故障问题,特别是在RK3288平台和Android 6.0系统上。通过分析具体案例,本文提供了详细的解决方案和应对策略,旨在帮助开发者有效解决相机连接问题,提升应用的稳定性和用户体验。 ... [详细]
author-avatar
liuliyu2000_867
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有