名片夹android布局代码,Android自定义布局实现仿qq侧滑部分代码

自定义布局实现仿qq侧滑部分Android代码,供大家参考,具体内容如下

6aa17234e16474c4c8fa803f1b89b603.gif

实现说明:

通过自定义布局实现:

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);

}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值