android开发中opacity什么意思

近期关于android开发中opacity什么意思的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯 ,并进行了系统化的梳理 。若这些内容恰好能为您提供参考,将是我们最大的荣幸。

opacity是不透明度的意思

import?android.content.Context;

import?android.util.AttributeSet;

import?android.widget.TextView;

public?class?AlphaTextView?extends?TextView?{

public?AlphaTextView(Context?context)?{

super(context);

}

public?AlphaTextView(Context?context,?AttributeSet?attrs)?{

super(context,?attrs);

}

public?AlphaTextView(Context?context,?AttributeSet?attrs,?int?defStyle)?{

super(context,?attrs,?defStyle);

}

@Override

public?boolean?onSetAlpha(int?alpha)?{

setTextColor(getTextColors().withAlpha(alpha));

setHintTextColor(getHintTextColors().withAlpha(alpha));

setLinkTextColor(getLinkTextColors().withAlpha(alpha));

return?true;

}

}

如何在ListView中嵌套ListView

一、分析

1 、最简单的布局:只有一个ListView

如果整个页面只有一个ListView的话,那么由于ListView本身带有滚动效果 ,所以当加载的数据超过页面显示的范围时 ,可以通过上下滑动来查看所有的item。

因此这种情况下,不需要添加ScrollView 。

2、其它布局A+ListView

这种情况下,如果布局A定义在ListView的前面 ,那么当布局A所占的比例较大,或者ListView加载的数据较多时,都会导致ListView显示不完全 。同样 ,由于ListView自身可以滚动,因此仍然可以通过上下滚动来查看ListView的所有item。

如图所示:

3、其它布局B+ListView

这种情况下,假设布局B定义在ListView的后面 ,那么就会出现两种情况:

(1) 、ListView加载的数据不多,可以完全显示ListView的每一项,那么如果后面还有足够剩余的空间的话 ,布局B能正常显示;

(2) 、ListView加载的数据加多,那么就会导致留给布局B的空间不足,或者根本就没有 ,布局B将会显示不完全或者完全不显示。

而不管怎么 ,ListView本身的内容,都可以通过滑动来查看 。

对于第三种情况,如果不重新考虑布局的话 ,那么就需要添加ScrollView,用于查看剩余页面内容。

二、ScrollView和ListView的冲突问题

1、给ListView指定一个高度

例如设置android:layout_height="240dip",那么可以解决 ,可能会影响美观。

如图所示:

日本刀专卖

刀剑专卖

刀剑

2 、外面再添加个ScrollView

这种情况下,会出现问题 。如图所示:

3、给ScrollView设置属性:android:fillViewport="true"

测试的时候发现,如果ListView加载的数据不多的话 ,确实可以解决,但是当ListView加载的数据较多的时候,仍旧无法显示完全 ,并且这个时候ListView自身也无法滚动了。

三、解决办法有两种

1 、在计算listview总高度并设置

ListView listView = (ListView) findViewById(id);

YourAdapter adapter = new MyAdapter("初始化你的适配器");

listView.setAdapter(adapter);

setListViewHeightBasedOnChildren(listView);(在setAdapter后调用自定义的方法)

复制代码代码如下:

/**

* @param listView

*/

private void setListViewHeightBasedOnChildren(ListView listView) {

ListAdapter listAdapter = listView.getAdapter();

if (listAdapter == null) {

return;

}

int totalHeight = 0;

for (int i = 0; i < listAdapter.getCount(); i++) {

View listItem = listAdapter.getView(i, null, listView);

listItem.measure(0, 0);

totalHeight += listItem.getMeasuredHeight();

}

ViewGroup.LayoutParams params = listView.getLayoutParams();

params.height = totalHeight

+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));

listView.setLayoutParams(params);

}

使用该方法需要注意:子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure() ,所以会在onMeasure()时抛出异常。

2、 自定义ListView ,重载onMeasure()方法,设置全部显示

复制代码代码如下:

package com.meiya.ui;

import android.widget.ListView;

/**

*

* @Description: scrollview中内嵌listview的简单实现

*

* @File: ScrollViewWithListView.java

*

* @Paceage com.meiya.ui

*

*

* @Date 下午03:02:38

*

* @Version

*/

public class ScrollViewWithListView extends ListView {

public ScrollViewWithListView(android.content.Context context,

android.util.AttributeSet attrs) {

super(context, attrs);

}

/**

* Integer.MAX_VALUE >> 2,如果不设置,系统默认设置是显示两条

*/

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,

MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, expandSpec);

}

}

以上可以解决scrollView内嵌listView ,但是有一个问题是第一次进入界面时动态加载listview的items后页面会跳转到listview的第一个子项,这很蛋疼,

无奈又不知道怎么解决 ,就先用

复制代码代码如下:

scrollView.post(new Runnable() {

//让scrollview跳转到顶部,必须放在runnable()方法中

@Override

public void run() {

scrollView.scrollTo(0, 0);

}

});

android 左右滑屏怎么实现 哪位大神教教我

如果你是想实现类似QQ微信的好友分组的话,那麻烦你用ExpandableList

这个并不是ListView里嵌套ListView

如果你非要嵌套,也不是不行,子ListView必须要设置它的高度,即要展开所有item,否则滑动不了的

展开所有item的ListView,我这有现成的,在xml里用这个去声明吧

Java中isEmpty方法如何使用?

代码如下:

package kexc.scroll;

import android.content.Context;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.view.VelocityTracker;

import android.view.View;

import android.view.ViewConfiguration;

import android.view.ViewGroup;

import android.widget.Scroller;

/**

* 仿Launcher中的WorkSapce,可以左右滑动切换屏幕的类

*

*/

public class ScrollLayout extends ViewGroup {

/*

* onMeasure方法在控件的父元素正要放置它的子控件时调用 。它会问一个问题 ,“你想要用多大地方啊? ”,然后传入两个参数——

* widthMeasureSpec和heightMeasureSpec。它们指明控件可获得的空间以及关于这个空间描述的元数据。

* 比返回一个结果要好的方法是你传递View的高度和宽度到setMeasuredDimension方法里 。

* 一个MeasureSpec包含一个尺寸和模式。

* 有三种可能的模式:

* UNSPECIFIED:父布局没有给子布局任何限制,子布局可以任意大小。

* EXACTLY:父布局决定子布局的确切大小 。不论子布局多大 ,它都必须限制在这个界限里 。

* AT_MOST:子布局可以根据自己的大小选择任意大小。

*/

/*

* VelocityTracker类

*

* 功能: 根据触摸位置计算每像素的移动速率。

*

* 常用方法有:

*

* public void addMovement (MotionEvent ev) 功能:添加触摸对象MotionEvent , 用于计算触摸速率 。

* public void computeCurrentVelocity (int units)

* 功能:以每像素units单位考核移动速率。额,其实我也不太懂 ,赋予值1000即可。 参照源码 该units的意思如下: 参数 units :

* The units you would like the velocity in. A value of 1 provides pixels

* per millisecond, 1000 provides pixels per second, etc. public float

* getXVelocity () 功能:获得X轴方向的移动速率 。

*/

/*

* ViewConfiguration类

*

* 功能: 获得一些关于timeouts(时间)、sizes(大小) 、distances(距离)的标准常量值 。

*

* 常用方法:

*

* public int getScaledEdgeSlop()

*

* 说明:获得一个触摸移动的最小像素值。也就是说 ,只有超过了这个值,才代表我们该滑屏处理了 。

*

* public static int getLongPressTimeout()

*

* 说明:获得一个执行长按事件监听(onLongClickListener)的值。也就是说,对某个View按下触摸时 ,只有超过了

*

* 这个时间值在,才表示我们该对该View回调长按事件了;否则,小于这个时间点松开手指 ,只执行onClick监听

*/

private static final String TAG = "ScrollLayout";

private Scroller mScroller;

private VelocityTracker mVelocityTracker;

private int mCurScreen;//当前屏幕

private int mDefaultScreen = 0;

//两种状态: 是否处于滑屏状态

private static final int TOUCH_STATE_REST = 0;//静止状态

private static final int TOUCH_STATE_SCROLLING = 1;//滑屏状态

private static final int SNAP_VELOCITY = 600; //最小的滑动速率

private int mTouchState = TOUCH_STATE_REST;

private int mTouchSlop;// change 多少像素算是发生move操作

private float mLastMotionX;

private float mLastMotionY;

public ScrollLayout(Context context, AttributeSet attrs) {

this(context, attrs, 0);

// TODO Auto-generated constructor stub

}

public ScrollLayout(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

// TODO Auto-generated constructor stub

mScroller = new Scroller(context);

mCurScreen = mDefaultScreen;

//初始化一个最小滑动距离

mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();

}

/**

* 生成view

*/

@Override

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

// TODO Auto-generated method stub

if (changed) {

int childLeft = 0;

final int childCount = getChildCount();

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

final View childView = getChildAt(i);

if (childView.getVisibility() != View.GONE) {

final int childWidth = childView.getMeasuredWidth();

childView.layout(childLeft, 0, childLeft + childWidth,

childView.getMeasuredHeight());

childLeft += childWidth;

}

}

}

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

Log.e(TAG, "onMeasure");

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

final int width = MeasureSpec.getSize(widthMeasureSpec);

final int widthMode = MeasureSpec.getMode(widthMeasureSpec);

if (widthMode != MeasureSpec.EXACTLY) {

throw new IllegalStateException(

"ScrollLayout only canmCurScreen run at EXACTLY mode!");

}

final int heightMode = MeasureSpec.getMode(heightMeasureSpec);

if (heightMode != MeasureSpec.EXACTLY) {

throw new IllegalStateException(

"ScrollLayout only can run at EXACTLY mode!");

}

// The children are given the same width and height as the scrollLayout

final int count = getChildCount();

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

getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);

}

// Log.e(TAG, "moving to screen "+mCurScreen);

scrollTo(mCurScreen * width, 0);

}

/**

* According to the position of current layout scroll to the destination

* page.

*/

public void snapToDestination() {

// 判断是否超过下一屏的中间位置,如果达到就抵达下一屏,否则保持在原屏幕

// 这样的一个简单公式意思是:假设当前滑屏偏移值即 scrollCurX 加上每个屏幕一半的宽度 ,除以每个屏幕的宽度就是

// 我们目标屏所在位置了。 假如每个屏幕宽度为320dip, 我们滑到了500dip处,很显然我们应该到达第二屏,索引值为1

// 即(500 + 320/2)/320 = 1

final int screenWidth = getWidth();

final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth;

snapToScreen(destScreen);

}

public void snapToScreen(int whichScreen) {

// get the valid layout page

whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));

if (getScrollX() != (whichScreen * getWidth())) {

final int delta = whichScreen * getWidth() - getScrollX();

mScroller.startScroll(getScrollX(), 0, delta, 0,

Math.abs(delta) * 5);

mCurScreen = whichScreen;

onScreenChangeListener.onScreenChange(mCurScreen);

invalidate(); // Redraw the layout

}

}

public void setToScreen(int whichScreen) {

whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));

mCurScreen = whichScreen;

scrollTo(whichScreen * getWidth(), 0);

}

public int getCurScreen() {

return mCurScreen;

}

/**

* 控制view跟随手指滑动 由父视图调用用来请求子视图根据偏移值 mScrollX,mScrollY重新绘制

*/

@Override

public void computeScroll() {

// 如果返回true,表示动画还没有结束

// 因为前面startScroll ,所以只有在startScroll完成时 才会为false

if (mScroller.computeScrollOffset()) {

// 产生了动画效果,根据当前值 每次滚动一点

scrollTo(mScroller.getCurrX(), mScroller.getCurrY());

postInvalidate();

}

}

/*

* 其中:onInterceptTouchEvent()主要功能是控制触摸事件的分发,例如是子视图的点击事件还是滑动事件 。

* 其他所有处理过程均在onTouchEvent()方法里实现了。 1、屏幕的滑动要根据手指的移动而移动 ----

* 主要实现在onTouchEvent()方法中

*

isEmpty()方法有很多类都有 ,对于String类 ,它是Java 6.0引入的,

当且仅当String的length()方法返回0时返回true,否则返回false。

比如:"hello".isEmpty()就返回false ,而"".isEmpty()返回true 。

其他的isEmpty()方法,就像它的名字表示的那样,判断对象内容是否为空 ,比如集合类里面是否包含元素的 。列一个全的吧:

isEmpty() - 类 java.awt.geom.Arc2D.Double 中的方法

确定 RectangularShape 是否为空。

isEmpty() - 类 java.awt.geom.Arc2D.Float 中的方法

确定 RectangularShape 是否为空。

isEmpty() - 类 java.awt.geom.Area 中的方法

测试此 Area 对象是否包括其他区域 。

isEmpty() - 类 java.awt.geom.Ellipse2D.Double 中的方法

确定 RectangularShape 是否为空。

isEmpty() - 类 java.awt.geom.Ellipse2D.Float 中的方法

确定 RectangularShape 是否为空。

isEmpty() - 类 java.awt.geom.Rectangle2D.Double 中的方法

确定 RectangularShape 是否为空 。

isEmpty() - 类 java.awt.geom.Rectangle2D.Float 中的方法

确定 RectangularShape 是否为空。

isEmpty() - 类 java.awt.geom.RectangularShape 中的方法

确定 RectangularShape 是否为空。

isEmpty() - 类 java.awt.geom.RoundRectangle2D.Double 中的方法

确定 RectangularShape 是否为空 。

isEmpty() - 类 java.awt.geom.RoundRectangle2D.Float 中的方法

确定 RectangularShape 是否为空。

isEmpty() - 类 java.awt.Rectangle 中的方法

确定 RectangularShape 是否为空。

isEmpty() - 类 java.awt.RenderingHints 中的方法

如果此 RenderingHints 未包含键-值映射关系,则返回 true 。

isEmpty() - 类 java.beans.beancontext.BeanContextSupport 中的方法

报告此 BeanContext 是否为空。

isEmpty() - 类 java.lang.String 中的方法

当且仅当 String.length() 为 0 时返回 true。

isEmpty() - 类 java.util.AbstractCollection 中的方法

如果此 collection 不包含元素,则返回 true 。

isEmpty() - 类 java.util.AbstractMap 中的方法

如果此映射未包含键-值映射关系 ,则返回 true 。

isEmpty() - 类 java.util.ArrayDeque 中的方法

如果此双端队列未包含任何元素,则返回 true。

isEmpty() - 类 java.util.ArrayList 中的方法

如果此列表中没有元素,则返回 true

isEmpty() - 类 java.util.BitSet 中的方法

如果此 BitSet 中没有包含任何设置为 true 的位 ,则返回 ture。

isEmpty() - 接口 java.util.Collection 中的方法

如果此 collection 不包含元素,则返回 true 。

isEmpty() - 类 java.util.concurrent.ConcurrentHashMap 中的方法

如果此映射不包含键-值映射关系,则返回 true。

isEmpty() - 类 java.util.concurrent.ConcurrentLinkedQueue 中的方法

如果此队列不包含任何元素 ,则返回 true。

isEmpty() - 类 java.util.concurrent.ConcurrentSkipListMap 中的方法

如果此映射未包含键-值映射关系 ,则返回 true 。

isEmpty() - 类 java.util.concurrent.ConcurrentSkipListSet 中的方法

如果此 set 不包含任何元素,则返回 true。

isEmpty() - 类 java.util.concurrent.CopyOnWriteArrayList 中的方法

如果此列表不包含任何元素,则返回 true。

isEmpty() - 类 java.util.concurrent.CopyOnWriteArraySet 中的方法

如果此 set 不包含任何元素 ,则返回 true 。

isEmpty() - 类 java.util.concurrent.SynchronousQueue 中的方法

始终返回 true。

isEmpty() - 类 java.util.Dictionary 中的方法

测试此 dictionary 是否不存在从键到值的映射。

isEmpty() - 类 java.util.HashMap 中的方法

如果此映射不包含键-值映射关系,则返回 true 。

isEmpty() - 类 java.util.HashSet 中的方法

如果此 set 不包含任何元素,则返回 true。

isEmpty() - 类 java.util.Hashtable 中的方法

测试此哈希表是否没有键映射到值。

isEmpty() - 类 java.util.IdentityHashMap 中的方法

如果此标识哈希映射不包含键-值映射关系 ,则返回 true 。

isEmpty() - 类 java.util.jar.Attributes 中的方法

如果此 Map 不包含属性,则返回 true 。

isEmpty() - 接口 java.util.List 中的方法

如果列表不包含元素,则返回 true。

isEmpty() - 接口 java.util.Map 中的方法

如果此映射未包含键-值映射关系 ,则返回 true。

isEmpty() - 接口 java.util.Set 中的方法

如果 set 不包含元素,则返回 true 。

isEmpty() - 类 java.util.TreeSet 中的方法

如果此 set 不包含任何元素,则返回 true。

isEmpty() - 类 java.util.Vector 中的方法

测试此向量是否不包含组件。

isEmpty() - 类 java.util.WeakHashMap 中的方法

如果此映射不包含键-值映射关系 ,则返回 true 。

isEmpty() - 类 javax.activation.MimeTypeParameterList 中的方法

确定此列表是否为空。

isEmpty() - 接口 javax.management.openmbean.TabularData 中的方法

如果此 TabularData 实例中包含的 CompositeData 值的数目(即行数)为零,则返回 true。

isEmpty() - 类 javax.management.openmbean.TabularDataSupport 中的方法

如果此 TabularDataSupport 实例不包含任何行,则返回 true 。

isEmpty() - 类 javax.management.timer.Timer 中的方法

测试计时器通知列表是否为空。

isEmpty() - 接口 javax.management.timer.TimerMBean 中的方法

测试计时器通知列表是否为空。

isEmpty() - 类 javax.naming.CompositeName 中的方法

确定此复合名称是否为空 。

isEmpty() - 类 javax.naming.CompoundName 中的方法

确定此组合名称是否为空。

isEmpty() - 类 javax.naming.ldap.LdapName 中的方法

确定此 LDAP 名称是否为空。

isEmpty() - 接口 javax.naming.Name 中的方法

确定此名称是否为空 。

isEmpty() - 接口 javax.print.attribute.AttributeSet 中的方法

如果此属性集不包含任何属性 ,则返回 true 。

isEmpty() - 类 javax.print.attribute.HashAttributeSet 中的方法

如果此属性集不包含任何属性 ,则返回 true。

isEmpty() - 类 javax.script.SimpleBindings 中的方法

如果此映射未包含键-值映射关系,则返回 true。

isEmpty() - 类 javax.swing.DefaultListModel 中的方法

测试此列表中是否有组件 。

isEmpty() - 类 javax.swing.text.html.parser.Element 中的方法

检查是否为空

isEmpty() - 类 javax.swing.text.SimpleAttributeSet 中的方法

检查属性集是否为空。

关于android开发中opacity什么意思的探讨就到这里,您是否还有其他想了解的内容?欢迎在评论区留言告诉我们 ,同时别忘了点击关注哦!

(1)

猜你喜欢

发表回复

本站作者才能评论

评论列表(3条)

  • 诚晋号的头像
    诚晋号 2026年07月27日

    我是诚晋号的签约作者“诚晋号”

  • 诚晋号
    诚晋号 2026年07月27日

    本文概览:近期关于android开发中opacity什么意思的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,将是我们最大的荣幸...

  • 诚晋号
    用户072707 2026年07月27日

    文章不错《android开发中opacity什么意思》内容很有帮助

联系我们:

邮件:诚晋号@gmail.com

工作时间:周一至周五,9:30-17:30,节假日休息

关注微信