自定义布局实现仿qq侧滑部分android代码,供大家参考,具体内容如下
实现说明:
通过自定义布局实现:
slidinglayout继承于 horizontalscrollview
/**
* created by administrator on 2017/3/29.
*/
public class slidinglayout extends horizontalscrollview{
/** 左侧右边间距 */
private float rightpadding;
/** 左侧菜单的宽度 */
private int leftwidth;
private viewgroup leftview;
private viewgroup contentview;
private final context context;
private boolean isopenmeun = true;
private imageview shadowview;
public slidinglayout(context context) {
this(context,null);
}
public slidinglayout(context context, attributeset attrs) {
this(context, attrs,0);
}
public slidinglayout(context context, attributeset attrs, int defstyleattr) {
super(context, attrs, defstyleattr);
this.context = context;
//获取自定义的属性
typedarray typedarray=context.obtainstyledattributes(attrs,r.styleable.slidinglayout);
rightpadding=typedarray.getdimension(r.styleable.slidinglayout_rightpadding,80);
//计算左侧菜单的宽度
leftwidth = (int) (getscreenwidth() - rightpadding + 0.5f);
}
//获取屏幕的宽度
private float getscreenwidth() {
return getresources().getdisplaymetrics().widthpixels;
}
@override /** 布局解析完毕的时候 */
protected void onfinishinflate() {
super.onfinishinflate();
viewgroup container= (viewgroup) getchildat(0);
if(container.getchildcount() > 2){
throw new illegalstateexception("slidinglayout中只能放两个子view");
}
//获取左侧菜单view
leftview = (viewgroup) container.getchildat(0);
//获取主布局的viwe
contentview = (viewgroup) container.getchildat(1);
//设置子view 的宽度
leftview.getlayoutparams().width = leftwidth;
contentview.getlayoutparams().width = (int) getscreenwidth();
//移除父布局
container.removeview(contentview);
framelayout framelayout=new framelayout(context);
framelayout.setlayoutparams(new viewgroup.layoutparams(viewgroup.layoutparams.match_parent,viewgroup.layoutparams.match_parent));
framelayout.addview(contentview);
//添加阴影
shadowview = new imageview(context);
shadowview.setbackgroundcolor(color.parsecolor("#99000000"));
framelayout.addview(shadowview);
container.addview(framelayout);
}
/**
* 该方法在滑动的时候会不断的调用
* @param l : left
* @param t
* @param oldl
* @param oldt
*/
@override
protected void onscrollchanged(int l, int t, int oldl, int oldt) {
super.onscrollchanged(l, t, oldl, oldt);
float x=l*0.8f;//偏移量
leftview.settranslationx(x);//平移
float color = 1 - l * 1.0f / leftwidth;
shadowview.setalpha(color);
}
@override
public boolean ontouchevent(motionevent ev) {
switch (ev.getaction()) {
case motionevent.action_up://手指抬起的时候判断是否关闭
int currentx = getscrollx();
if (isopenmeun) {
if (currentx >= leftwidth / 2) {
closemeun();
} else {
openmeun();
}
//点击关闭
float x = ev.getx();
if (x > leftwidth) {
closemeun();
}
return true;
} else {//关闭状态
if (currentx < leftwidth / 2) {
openmeun();
} else {
closemeun();
}
return true;
}
}
return super.ontouchevent(ev);
}
/** 关闭菜单 */
public void closemeun(){
isopenmeun = false;
smoothscrollto(leftwidth,0);// 250ms
}
/** 打开菜单 */
public void openmeun(){
isopenmeun = true;
smoothscrollto(0,0);
}
}
attrs属性文件
布局方面
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rightpadding="65dp"
tools:context="com.example.myqq.mainactivity">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
activity
package com.example.myqq;
import android.animation.objectanimator;
import android.annotation.targetapi;
import android.support.v7.app.appcompatactivity;
import android.os.bundle;
import android.view.windowmanager;
import android.widget.arrayadapter;
import android.widget.imageview;
import android.widget.listview;
public class mainactivity extends appcompatactivity {
private string strings[] = {"开通会员", "qq钱包", "个性装扮", "我的收藏", "我的相册", "我的文件", "我的日程", "我的名片夹"};
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setstate();
setcontentview(r.layout.activity_main);
listview listview= (listview) findviewbyid(r.id.list_left);
listview.setdividerheight(0);
listview.setadapter(new arrayadapter<>(this,android.r.layout.simple_list_item_1,strings));
imageview bgimg1= (imageview) findviewbyid(r.id.bgimg);
float currenty=bgimg1.gettranslationy();
objectanimator animator = objectanimator.offloat(bgimg1, "translationy", currenty, -100, -40, currenty);
animator.setduration(5000);
animator.setrepeatcount(objectanimator.infinite);
animator.start();
}
@targetapi(20)
private void setstate() {
windowmanager.layoutparams params=new windowmanager.layoutparams();
params.flags=windowmanager.layoutparams.flag_translucent_status;
getwindow().setattributes(params);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。