当前位置:文档之家› Android 自定义实现抽屉SlidingDrawer的功能

Android 自定义实现抽屉SlidingDrawer的功能

Android 自定义实现抽屉SlidingDrawer的功能
Android 自定义实现抽屉SlidingDrawer的功能

Android自定义实现抽屉SlidingDrawer的功能

最近项目中需要实现上拉功能,首先想到的就是Android本身自带的抽屉SlidingDrawer,最后也实现了不过,出现的问题就是设置背景色问题,handl er和content是两个不同的部分,这就造成图片要做成两部分,从而产生两个部分图片看起来不是一个整体,而且我这个上拉功能,里面要实现一个水平滚动功能,而SlidingDrawer还有其他的限制,同时官方给出api 17以后,这个功能已经废弃,所以自己自定这样一个上拉功能是必须的。

这里我是继承LinearLayout同时实现GestureDetector.OnGestureListener来实现上拉功能。下面是代码:

001

package com.exampl e.test;

002

003

import android.content.Context;

004

import android.os.AsyncTask;

005

import android.util.AttributeSet;

006

import android.view.GestureDetector;

007

import android.view.MotionEvent;

008

import android.widget.LinearLayout;

009

import android.widget.RelativeLayout;

010

011

public class PanelBom extends LinearLayout impl ements GestureDetector.OnGestureListener{

012

013

GestureDetector mGesture = null;

014

private bool ean isScrolling = false;

015

private int MAX_HEIGHT = 80;//拖动的最大高度,当前布局位于父布局下面-80位置,这个仅仅是调试参数,这个变量是动态设置的。

016

private fl oat mScrollX; // 滑块滑动距离

017

public PanelBom(Context context) {

018

super(context);

019

init();

020

}

021

public PanelBom(Context context, AttributeSet attrs) {

022

super(context, attrs);

023

init();

024

}

025

//初始化一些参数

026

public void init(){

027

mGesture = new GestureDetector(this);

028

mGesture.setIsLongpressEnabl ed(false);

029

setBackgroundResource(R.drawabl e.button_bar);

030

}

031

032

@Overrid e

033

public bool ean onTouchEvent(MotionEvent event) {

034

if (MotionEvent.ACTION_UP == event.getAction() && isScrolling == true) {

035

https://www.doczj.com/doc/974671927.html,youtParams layoutParams = (https://www.doczj.com/doc/974671927.html,youtParams)getLayoutParams(); 036

// 缩回去

037

if (layoutParams.bottomMargin < -MAX_HEIGHT / 2) {

038

new AsynMove().execute(-20);//负--往下

039

} else {

040

new AsynMove().execute(20);//正--往上

041

}

042

}

043

return mGesture.onTouchEvent(event);

044

}

045

//Touch down时触发

046

@Overrid e

047

public bool ean onDown(MotionEvent e) {

048

mScrollX = 0;

049

isScrolling = false;

050

// 将之改为true,不然事件不会向下传递.

051

return true;

052

}

053

//Touch了还没有滑动时触发

054

@Overrid e

055

public void onShowPress(MotionEvent e) {

056

057

}

058

@Overrid e

059

public bool ean onSingl eTapUp(MotionEvent e) {

060

https://www.doczj.com/doc/974671927.html,youtParams layoutParams = (https://www.doczj.com/doc/974671927.html,youtParams) getLayoutParams(); 061

// 说明在上面,要往下

062

if (layoutParams.bottomMargin >= 0) {

063

new AsynMove().execute(-20);//负--往下

064

} else {

065

new AsynMove().execute(20);//正--往上

066

}

067

return true;

068

}

069

//Touch了滑动时触发

070

@Overrid e

071

public bool ean onScroll(MotionEvent e1, MotionEvent e2, fl oat distanceX,

072

fl oat distanceY) {

073

isScrolling = true;

074

mScrollX += distanceY;

075

https://www.doczj.com/doc/974671927.html,youtParams layoutParams = (https://www.doczj.com/doc/974671927.html,youtParams)getLayoutParams(); 076

layoutParams.bottomMargin += mScrollX;

077

if (layoutParams.bottomMargin >= 0) {

078

isScrolling = false;// 拖过头了不需要再执行AsynMove了

079

layoutParams.bottomMargin = 0;

080

} else if (layoutParams.bottomMargin <= -MAX_HEIGHT) {

081

// 拖过头了不需要再执行AsynMove了

082

isScrolling = false;

083

layoutParams.bottomMargin = -MAX_HEIGHT;

084

085

setLayoutParams(layoutParams);

086

return false;

087

}

088

//Touch了不移动一直Touch down时触发

089

@Overrid e

090

public void onLongPress(MotionEvent e) {

091

092

}

093

//Touch了滑动一点距离后,up时触发。

094

@Overrid e

095

public bool ean onFling(MotionEvent e1, MotionEvent e2, fl oat vel ocityX, 096

fl oat vel ocityY) {

097

return false;

098

}

099

//异步更新布局的位置

100

class AsynMove extends AsyncTask {

101

@Overrid e

102

protected Void doInBackground(Integer... params) {

103

int times = 0;

104

int divi = Math.abs(params[0]);

105

if (MAX_HEIGHT % divi == 0)// 整除

106

times = MAX_HEIGHT / Math.abs(params[0]);

else

108

times = MAX_HEIGHT / divi + 1;// 有余数

109

110

for (int i = 0; i < times; i++) {

111

publishProgress(params[0]);

112

try {

113

Thread.sl eep(divi);

114

} catch (InterruptedException e) {

115

e.printStackTrace();

116

}

117

}

118

return null;

119

}

120

@Overrid e

121

protected void onProgressUpdate(Integer... values) {

122

https://www.doczj.com/doc/974671927.html,youtParams layoutParams = (https://www.doczj.com/doc/974671927.html,youtParams) getLayoutParams();

123

if (values[0] < 0) {

124

layoutParams.bottomMargin = Math.max(layoutParams.bottomMargin + values[0],

-MAX_HEIGHT);

125

} else {

126

layoutParams.bottomMargin = Math.min(layoutParams.bottomMargin + values[0], 0);

127

}

128

setLayoutParams(layoutParams);

130

super.onProgressUpdate(values);

131

}

132

}

133

}

主界面:

01

package com.exampl e.test;

02

03

import android.app.Activity;

04

import android.os.Bundl e;

05

import android.widget.RelativeLayout;

06

07

public class Main5 extends Activity{

08

09

RelativeLayout Parent;

10

PanelBom panelBom;

11

https://www.doczj.com/doc/974671927.html,youtParams parentParams;

12

https://www.doczj.com/doc/974671927.html,youtParams paneBomParams;

13

@Overrid e

14

protected void onCreate(Bundl e savedInstanceState) {

15

super.onCreate(savedInstanceState);

16

Parent = new RelativeLayout(getApplicationContext());

17

panelBom = new PanelBom(getApplicationContext());

18

parentParams = new https://www.doczj.com/doc/974671927.html,youtParams(https://www.doczj.com/doc/974671927.html,youtParams.MATCH_PARENT, https://www.doczj.com/doc/974671927.html,youtParams.MATCH_PARENT);

paneBomParams = new

https://www.doczj.com/doc/974671927.html,youtParams(https://www.doczj.com/doc/974671927.html,youtParams.MATCH_PARENT, 150);

20

paneBomParams.addRul e(RelativeLayout.ALIGN_PARENT_BOTTOM);

21

paneBomParams.bottomMargin = -80;

22

Parent.addView(panelBom, paneBomParams);

23

setContentView(Parent, parentParams);

24

}

25

26

}

实现的效果是:拖拉,点击实现上拉功能,效果图如下:

来源:清源教育

android 自定义圆角头像以及使用declare-styleable进行配置属性解析

android 自定义圆角头像以及使用declare-styleable进行配置属性解析由于最新项目中正在检查UI是否与效果图匹配,结果关于联系人模块给的默认图片是四角稍带弧度的圆角,而我们截取的图片是正方形的,现在要给应用统一替换。应用中既用到大圆角头像(即整个头像是圆的)又用到四角稍带弧度的圆角头像,封装一下以便重用。以下直接见代码 [java] view plain copy 在CODE上查看代码片派生到我的代码片 package com.test.demo; import com.test.demo.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.widget.ImageView; /** * 圆角imageview */ public class RoundImageView extends ImageView { private static final String TAG = "RoundImageView"; /** * 图片的类型,圆形or圆角 */ private int type; public static final int TYPE_CIRCLE = 0; public static final int TYPE_ROUND = 1; /** * 圆角大小的默认值

android studio 控件常用属性

android studio 控件常用属性 下面是RelativeLayout各个属性 1.android:layout_above="@id/xxx" --将控件置于给定ID控件之上 2.android:layout_below="@id/xxx" --将控件置于给定ID控件之下 3. android:layout_toLeftOf="@id/xxx" --将控件的右边缘和给定ID控件的左边缘对齐 4.android:layout_toRightOf="@id/xxx" --将控件的左边缘和给定ID控件的右边缘对齐 5. android:layout_alignLeft="@id/xxx" --将控件的左边缘和给定ID控件的左边缘对齐 6.android:layout_alignTop="@id/xxx" --将控件的上边缘和给定ID控件的上边缘对齐 7.android:layout_alignRight="@id/xxx" --将控件的右边缘和给定ID控件的右边缘对齐 8.android:layout_alignBottom="@id/xxx" --将控件的底边缘和给定ID控件的底边缘对齐 9.android:layout_alignParentLeft="true" --将控件的左边缘和父控件的左边缘对齐 10. android:layout_alignParentTop="true" --将控件的上边缘和父控件的上边缘对齐 11. android:layout_alignParentRight="true" --将控件的右边缘和父控件的右边缘对齐 12.android:layout_alignParentBottom="true" --将控件的底边缘和父控件的底边缘对齐 13.android:layout_centerInParent="true" --将控件置于父控件的中心位置 14.android:layout_centerHorizontal="true" --将控件置于水平方向的中心位置 15.android:layout_centerVertical="true" --将控件置于垂直方向的中心位置 android:layout_width 设置组件的宽度 android:layout_height 设置组件的高度 android:id 给组件定义一个id值,供后期使用 android:background 设置组件的背景颜色或背景图片 android:text 设置组件的显示文字 android:textColor 设置组件的显示文字的颜色 android:layout_below 组件在参考组件的下面 android:alignTop 同指定组件的顶平行

Android平台我的日记设计文档

Android平台我的日记 设计文档 项目名称:mydiray 项目结构示意: 阶段任务名称(一)布局的设计 开始时间: 结束时间: 设计者: 梁凌旭 一、本次任务完成的功能 1、各控件的显示 二、最终功能及效果 三、涉及知识点介绍 四、代码设计 activity_main.xml:

android:layout_centerHorizontal="true" android:layout_marginTop="88dp" android:text="@string/wo" android:textSize="35sp"/>

相关文档 最新文档