Android可滑動的開關效果

2021-08-27 01:31:42 字數 4178 閱讀 3350

閒著沒事,把之前寫的乙個demo放上來分享下。就是乙個開關,實現可滑動和動畫效果。不是切換。

好了,先上圖:

直接把自定義的這個view**放上來,有注釋應該很好理解:

首先是布局:

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

接著是這個view的**,繼承自linearlayout :

package com.lxb.switchdemo;

import android.content.context;

import android.graphics.color;

import android.os.handler;

import android.os.message;

import android.view.layoutinflater;

import android.view.motionevent;

import android.view.view;

import android.view.view.onclicklistener;

import android.view.animation.animation;

import android.view.animation.animation.animationlistener;

import android.view.animation.linearinterpolator;

import android.view.animation.translateanimation;

import android.widget.imageview;

import android.widget.linearlayout;

import android.widget.relativelayout;

import android.widget.textview;

public class switchview extends linearlayout implements onclicklistener

@override

protected void onlayout(boolean changed, int l, int t, int r, int b)

private handler mhandler = new handler()

} };

public void onclick(view v)

} /**

* 初始化控制項

*/private void initview()

if(cursor_right >= bg_right - margin)

v.layout(cursor_left, cursor_top, cursor_right, cursor_bottom);

lastx = (int) event.getrawx();

break;

case motionevent.action_up:

calculateischeck();

break;

}return true;

}}); }

/*** 計算處於true或是false區域, 並做改變處理

*/private void calculateischeck() else }

/*** 改變checked, 根據checked移動游標

* @param ischecked

*/private void changechecked(boolean ischecked) else

if(ischecked) else

cursormove(); }

/*** 游標移動

*/private void cursormove() else

animation.setduration(100);

animation.setinterpolator(new linearinterpolator());

animation.setanimationlistener(new animationlistener()

public void onanimationrepeat(animation animation)

public void onanimationend(animation animation) else

// 這裡不能馬上layout游標正確位置, 否則會有一點點閃屏

// 為了美觀, 這裡遲了一點點呼叫layout方法, 便不會閃屏

mhandler.sendemptymessagedelayed(handle_layout_cursor, 5);

// 這裡是根據是不是改變了ischecked值進行一些操作

if(checkedchange)

changetextcolor();}}

});iv_switch_cursor.startanimation(animation);

} /**

* 改變字型顯示顏色

*/private void changetextcolor() else }

/*** layout游標

*/private void layoutcursor() else

iv_switch_cursor.layout(cursor_left, cursor_top, cursor_right, cursor_bottom); }

/*** ischecked值改變***

*/public inte***ce oncheckedchangelistener

public boolean ischecked()

public void setchecked(boolean ischecked)

layoutcursor();

} }public void setoncheckedchangelistener(

oncheckedchangelistener oncheckedchangelistener)

}

最後是activity使用這個view:

package com.lxb.switchdemo;

import android.os.bundle;

import android.view.view;

import android.view.view.onclicklistener;

import android.widget.button;

import android.widget.linearlayout;

import android.widget.textview;

import android.widget.toast;

import com.lxb.switchdemo.switchview.oncheckedchangelistener;

public class switch_demoactivity extends activity implements onclicklistener

});layout.addview(sv);

btn_set_true = (button) findviewbyid(r.id.btn_set_true);

btn_set_false = (button) findviewbyid(r.id.btn_set_false);

btn_getstate = (button) findviewbyid(r.id.btn_getstate);

btn_set_true.setonclicklistener(this);

btn_set_false.setonclicklistener(this);

btn_getstate.setonclicklistener(this);

}public void onclick(view v)

}

private string getstate(boolean state)

return "關";}}

實現起來還是很簡單的,主要還是座標什麼的需要計算與調整。

當然可能還會有一些bug存在,有需要的可以下下來自行修改,也可以和我討論。

Android 自定義滑動開關

自定義view寫了這麼多篇幅,通用的屬性部分 測量 忽略不計 真正實現的部分就不到100行 先上效果圖 關閉狀態 開啟狀態 動起來 下面我們看下我們的實現 override protected void ondraw canvas canvas private void drawswichballb...

可觸控滑動具有回彈效果的Vue元件使用總結

發現乙個很實用的vue元件,最近做專案遇到一種常見的需要,雖說常見但是自己沒有試著寫過,然後去網上找了一下。需求圖如下 下面的導航欄內容太多需要做成滑動的 下面介紹一下我用到的這個元件 git位址 modulename refname isscreen isscreen getsearch gets...

Android 滑動效果高階篇(五) 3D旋轉

前面介紹了利用android自帶的控制項,進行滑動翻頁製作效果,現在我們通過 實現一些滑動翻頁的動畫效果。animation實現動畫有兩個方式 幀動畫 frame by frame animation 和補間動畫 tweened animation 本示例通過繼承animation自定義rotate...