Articles of android custom view

更改GridView的行为以使其水平滚动而不是垂直滚动

我想创建一个像GridView一样的UI元素,我希望它具有完整的function,但希望它可以水平滚动而不是垂直滚动。 通过水平滚动我的意思是它应该以这种方式构建而不是放在HorizontalScrollView 。 我的Custom GridView将具有固定的rows数,例如4-5 ,并且columns应该是基于Adapter的项目数量可extensible的。 您可以将其视为与原生GridView相反的function,但它应该保持function。 我已经查看了Google如何实现GridView的源代码,但我能够理解得非常少,并且从头开始制作View似乎不是一个好主意,因为我担心我不会能够像谷歌那样对记忆优化做出正确的判断。 我观察到GridView扩展了AbsListView ,所以我的问题是,它是AbsListView ,它允许GridView垂直滚动并从适配器添加项目,还是GridView增加了垂直滚动function? 我应该调整GridView或AbsListView吗? 知道是否已经做了我想做的事情会更好吗? 这已在Android Honeycomb 3.1及更高版本的原生图库和YouTube应用中实施。 所以,如果有人有想法,请详细说明。 Honeycomb Gallery应用程序的快照: Honeycomb YouTube应用程序的快照:

EditText的子类看起来与Android 4上的普通EditText不同

这是我在处理真实应用程序时发现的“错误”,但我创建了一个空白项目来重现它。 我有以下布局: MyEditText类看起来像这样: public class MyEditText extends EditText { public MyEditText(Context context){ super(context); } public MyEditText(Context context, AttributeSet attrs){ super(context, attrs); } public MyEditText(Context context, AttributeSet attrs, int defStyle){ super(context, attrs, defStyle); } } 除了Theme之外,我的styles.xml文件是空的 我希望MyEditText看起来像普通的EditText ,它在Android 5.0上,但在Android 2.3.7,Android 4.1.3或Android 4.4.4上没有。 在这些Android版本上, EditText的颜色不同,正常的一个在聚焦时有一个青色下划线,自定义版本有一个黑色下划线: 为什么会发生这种情况,我该如何预防呢? 编辑/更新: Google 似乎在支持库中通过引入AppCompatEditText类来解决这个问题。

自定义xml属性到@layout引用

我想用自己的xml属性创建自定义视图。 我想指定一个在我的自定义xml视图中膨胀的标题布局,如下所示: 这是可能的,如何从TypedArray获取布局资源? 所以最后我想做这样的事情: class MyCustomWidget extends FrameLayout { public ProfileTabLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ProfileTabLayout); int headerLayout = a.getLayout(R.styleable.MyCustomView_headerLayout, 0); // There is no such method a.recycle(); LayoutInflater.from(context) .inflate(headerLayout, this, true); } }

如何从XML扩展LinearLayout

任何人都可以建议一种方法来改进这个API8的例子吗? 虽然他们说这些视图可以用XML定义,但他们实际上做的是用java编写代码。 我明白为什么他们想要。 他们在扩展的LinearLayout中添加了一些成员,并在运行时确定了这些值。 根据哦,宇宙中的每个人,布局指令应该转移到XML。 但是对于这个应用程序,在运行时逻辑中保持原样设置是有意义的。 所以我们采用了混合方法。 膨胀视图,然后填充动态文本。 我无法弄清楚如何实现它。 这是源和我尝试过的。 来自API8示例,List4.java private class SpeechView extends LinearLayout { public SpeechView(Context context, String title, String words) { super(context); this.setOrientation(VERTICAL); // Here we build the child views in code. They could also have // been specified in an XML file. mTitle = new TextView(context); mTitle.setText(title); … 我想因为LinearLayout有一个android:id =“@ […]

使用自定义xml视图在Android中创建AlertDialog

如何在Android中创建这样的对话框? 我的想法是创建一个自定义的xml视图并将其膨胀到对话框中。 还有其他建议吗? 什么是对话框中间的“拖线”? 我真的需要那个。 提前致谢

如何在android中创建自定义通知

我需要在android中创建自定义通知而不是默认通知。 当前通知具有图标,标题和消息,如下图所示 我希望它像这样定制 我怎么能实现这一目标

在自定义视图上实现可访问性不会给出口头反馈

我已经打开了可访问性,我的设备在我浏览时说话。 我有一个自定义搜索seekbar并已实现以下内容: onTouchEvent摘录: … case MotionEvent.ACTION_MOVE: getParent().requestDisallowInterceptTouchEvent(true); setTouchAngle(pointToAngle(touchX, touchY)); score = getScoreFromAngle(angleStart,touchAngle); if (onScoreSetListener != null) { onScoreSetListener.onScorePoll(this, score); sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED); } break; … onPopulateAccessibilityEvent方法: @Override public void onPopulateAccessibilityEvent(AccessibilityEvent event) { super.onPopulateAccessibilityEvent(event); LogUtils.i(TAG,”onPopulateAccessibilityEvent()”,null); switch (event.getEventType()) { case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: LogUtils.d(TAG,”dispatchPopulateAccessibilityEvent() TYPE_VIEW_TEXT_CHANGED”,null); event.getText().add(String.valueOf(getScore())); break; } } 我可以看到在LogCat成功调用onPopulateAccessibilityEvent ,但设备没有给出任何反馈。 我希望现在的分数可以回读,但没有。 有没有人有任何见解?

绘制带圆角的ImageView时的效率

我有一个ImageView子类,我用它来绘制圆角图像。 代码基于这个答案 ,如下: public class ImageViewRoundedCorners extends ImageView { … @Override protected void onDraw(Canvas canvas) { Bitmap scaledBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Bitmap.Config.ARGB_8888); Canvas scaledCanvas = new Canvas(scaledBitmap); super.onDraw(scaledCanvas); drawRoundedCornerBitmap(canvas, scaledBitmap, getMeasuredWidth(), getMeasuredHeight()); scaledBitmap.recycle(); } protected void drawRoundedCornerBitmap(Canvas outputCanvas, Bitmap input, int w, int h) { Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888); Canvas canvas = new […]

为什么我不能强制我的一个视图在软件中渲染?

在我的自定义视图中,我使用Canvas.drawBitmap,其源位图比2048px宽。 这当然会在启用硬件加速时引起问题,每次调用drawBitmap时,LogCat会喷出“W / OpenGLRenderer(4968):位图太大而无法上传到纹理”。 所以为了解决这个问题,我尝试在我的视图上调用setLayerType(View.LAYER_TYPE_SOFTWARE, null) 。 唯一的问题是它似乎没有帮助。 当我尝试运行我的应用程序时,LogCat仍将发出警告,并且最终没有任何内容被绘制。 我不明白为什么会这样。 Android网站上的这篇文章明确指出: 您可以使用以下代码在运行时禁用单个视图的硬件加速: myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 有什么我做错了吗? 为什么Android不尊重setLayerType调用? [如果重要:我正在运行Android 3.2的三星Galaxy Tab 10.1上进行测试]

测试自定义View的onMeasure / onLayout / onDraw方法有什么好方法?

我刚刚编写了一个自定义View类,除其他外,它允许开发人员轻松设置边框(例如setBorderWidth , setBorderColor , setBorderWidthLeft等)。 我通过覆盖onMeasure / onDraw做到这一点,我想测试View正确绘制这些边框。 理想情况下,我想要一个比unit testing更高级别的东西:基本上我想强制执行如果我设置边框,它们按预期绘制; 如果我不设置它们就不会被绘制; 如果我更改它们,则会绘制新边框并且不再显示旧边框。 这让我知道我的观点在高层次上工作。 我考虑过的事情: 将视图与Robolectric隔离并使用模拟Canvas手动调用onDraw(但不测试失效) 制作一个Activity测试用例并以某种方式保存Activity的屏幕截图并以编程方式对其进行分析。 这些对我来说都不是很好,但我倾向于2)。 还有其他想法吗?