ios一些控件还是挺美丽的,可是对android程序猿来说可能比較苦逼,由于ios一些看起来简单的效果对android来说可能就没那么简单了,可是没办法非常多产品都是拿ios的一些控件叫android开发者来照着做,今天就来做一个设置中常见的开关效果,

思路:

1:准备二张图片 一个是包括开和关二种状态的图片,一个是上面滑动的button图片

2:这些图片肯定是不能通过原生态的控件显示上去的,要通过canvas画上去

3:要解决点击和滑动的事件冲突,由于点击包括 按下 离开,而滑动包括按下  移动 离开,

以下看代码逻辑首先是布局文件,非常easy

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.example.toggle.ui.MyToggleView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>

MyToggleView.java 自己定义的控件

package com.example.toggle.ui;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View; import com.example.toggle.R;
/**
* 一个view从创建到显示要经历的过程
* 1:构造函数 实例初始化
* 2:測量 onMeasure
* 3:假设当前view是ViewGroup 还要义务測量它孩子(子view)
* 4:指定控件的大小和位置 (onLayout)
* 假设当前view是ViewGroup 还要义务指定它孩子的大小和位置(子view)
* 5:绘制(就是画出来再屏幕上可见)onDraw(Canvas canvas)
* @author Administrator
*
* 点击事件包括点击 和 离开 而这个离开刚好和移动中的up事件一样
*
*/
public class MyToggleView extends View implements View.OnClickListener {
private static final String TAG = "MyToggleView";
Paint paint ;
private Bitmap bg_bitmap;
private Bitmap sliding_bitmap;
private float slidingLeft = 0;
private int slideLeftMax;
/**
* 自己定义样式用它
* @param context
* @param attrs
* @param defStyleAttr
*/
public MyToggleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 在布局时候用它
* @param context
* @param attrs
*/
public MyToggleView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
private void initView() {
paint = new Paint();
bg_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
sliding_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);
slideLeftMax = bg_bitmap.getWidth() - sliding_bitmap.getWidth();
setOnClickListener(this);
}
/**
* 在代码new的时候用它
* @param context
*/
public MyToggleView(Context context) {
super(context);
}
/**
* 測量
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
/**
* 这是父类去測量子view的大小 而我们能够不要父类去測量
*/
// super.onMeasure(bg_bitmap.getWidth(), bg_bitmap.getHeight());
/**
* 人为指定控件測量大小 (就是说没有測量)
*/
setMeasuredDimension(bg_bitmap.getWidth(), bg_bitmap.getHeight());
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bg_bitmap, 0, 0, paint);
canvas.drawBitmap(sliding_bitmap, slidingLeft , 0, paint);
}
private boolean isOpened = false;
/**
* isClickenble为true表示点击事件生效 但触摸事件无效
* isClickenble 为false表示点击事件失效 触摸事件有效
*/
private boolean isClickenble = false;
@Override
public void onClick(View v) {
if(isClickenble){
isOpened = !isOpened;
if(isOpened){
slidingLeft = bg_bitmap.getWidth()-sliding_bitmap.getWidth();
}else{
slidingLeft = 0;
}
invalidate();
}
}
private float startX = 0;//手指刚触动时候的x轴坐标
private float lastX = 0;//手指刚触动时候的x轴坐标
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);//运行父类的方法
switch (event.getAction()) {//推断滑动的动作 是刚按下 还是拖动 还是手指 抬起
case MotionEvent.ACTION_DOWN :
lastX = startX = event.getX();//这是距离 这个控件的x轴坐标值
isClickenble = true;
break;
case MotionEvent.ACTION_MOVE :
float endX = event.getX();
int distanceX = (int) Math.abs(endX - lastX);
if(distanceX > 5){
isClickenble = false;
}
refreshView(endX);
startX = event.getX();//又一次计算初始值
break;
case MotionEvent.ACTION_UP :
if(slidingLeft>slideLeftMax/2){ //开
isOpened = true;
slidingLeft = slideLeftMax;
}else{//关
isOpened = false;
slidingLeft = 0;
}
invalidate();
break;
}
return true;//表示自己处理 不须要调用父类的方法
}
private void refreshView(float endX) {
float distance = (endX - startX) ;
slidingLeft+=distance;
if(slidingLeft<0){
slidingLeft = 0;
}
if(slidingLeft>slideLeftMax){
slidingLeft = slideLeftMax;
}
invalidate();
}
}

效果图:

android 仿ios开关控件的更多相关文章

  1. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  2. Android仿iPhone 滚轮控件 实现

    Android_开发 实用滚轮效果选择数字http://blog.csdn.net/zhangtengyuan23/article/details/8653771 Android仿iPhone滚轮控件 ...

  3. android自己定义开关控件

    近日在android项目要使用开关控件.可是android中自带的开关控件不太惬意,所以就打算通过自己定义View写一个开关控件 ios的开关控件当然就是我要仿照的目标. 先上图:   waterma ...

  4. 自定义仿 IPhone 开关控件

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  5. 高仿QQ顶部控件之IOS SegmentView

    经常会看到QQ上面有一个 消息和电话 的顶部面板,这个空间是IOS7的分段控制,android中没有这个控件,今天在威哥的微信公众号中成功gank到这个自定义控件的实现,下面跟着尝试一波. 首先是定义 ...

  6. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

  7. Android 常用炫酷控件(开源项目)git地址汇总

    第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.P ...

  8. iOS常见控件的基本使用

    UI相关类继承关系 UIView 常见属性和方法 UIView属性 UIView方法 UIControl 常用控件 UIImageView 图片显示控件android ImageView UISlid ...

  9. UISwitch 开关控件

    UISwitch iOS中的开关控件,只有两种状态,打开或关闭. aSwitch.tintColor = [UIColor redColor]; //关闭状态下的渲染颜色 aSwitch.onTint ...

随机推荐

  1. unity中的main方法

    由于方法命名的原因,无意之间把一个方法命名为了Main,然后把这个方放到了Start方法中去执行,结果运行后发现这个方法竟然执行了两次 情况如下图: -------------- 检查代码,发现脚本并 ...

  2. POJ 3686 The Windy's(思维+费用流好题)

    The Windy's Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5362   Accepted: 2249 Descr ...

  3. [USACO12Jan][luogu3041] Video Game Combos [AC自动机+dp]

    题面 传送门 思路 首先,有一个非常显然的思路就是dp: 设$dp[i][j]$表示前i个字符,最后一个为j 然后发现这个东西有后效性 改!设$dp[i][j]$代表前i个字符,最后15个的状态为j( ...

  4. [SDOI2015][bzoj3993] 星际战争 [二分+最大流]

    题面 传送门 思路 首先,有一个非常明显的模型: 将激光武器放到一边,机器人放到另一边,从每一个激光武器向它可以攻击的机器人连边,形成一个二分图 建立附加源点$ss$和附加汇点$tt$,$ss$连所有 ...

  5. 关于可图化序列的一点结论 NEU 1429

    Graphic Sequence A graphic sequence is a sequence of numbers which can be the degree sequence of som ...

  6. linux系统——etc下的profile文件

    /etc/profile文件 /etc/profile是全局的,适用于所有的shell.在刚登录Linux时,首先启动 /etc/profile 文件. profile文件会告诉shell使用什么语言 ...

  7. MFC 对话框阴影效果

    在 OnInitDialog(Cdialog)里面添加 SetClassLong(this->m_hWnd, GCL_STYLE, GetClassLong(this->m_hWnd, G ...

  8. 海拔(bzoj 2007)

    Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个 正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1) ...

  9. pat 甲级 1135. Is It A Red-Black Tree (30)

    1135. Is It A Red-Black Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

  10. Linux内核情景分析之消息队列

    早期的Unix通信只有管道与信号,管道的缺点: 所载送的信息是无格式的字节流,不知道分界线在哪,也没通信规范,另外缺乏控制手段,比如保温优先级,管道机制的大小只有1页,管道很容易写满而读取没有及时,发 ...