我创建了一个自定义视图(在此处找到),其中包含enum类型的declare-styleable属性.在xml中,我现在可以为自定义属性选择一个枚举条目.现在我想创建一个以编程方式设置此值的方法,但我无法访问枚举.
attr.xml
<declare-styleable name="IconView">
<attr name="icon" format="enum">
<enum name="enum_name_one" value="0"/>
....
<enum name="enum_name_n" value="666"/>
</attr>
</declare-styleable>
Run Code Online (Sandbox Code Playgroud)
layout.xml
<com.xyz.views.IconView
android:id="@+id/heart_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:icon="enum_name_x"/>
Run Code Online (Sandbox Code Playgroud)
我需要的是:mCustomView.setIcon(R.id.enum_name_x);
但是我找不到枚举,或者我甚至不知道如何获得枚举或枚举的名称.
我在LinearLayout中有一些ImageView.我需要缩小ImageViews,以便它们保持纵横比,同时垂直安装在LinearLayout内部.水平地,我只需要它们彼此相邻.
我为此制作了一个简化的测试床,它嵌套了加权的布局,这样我就可以为ImageViews提供一个宽但不高的LinearLayout -
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="5">
<LinearLayout android:id="@+id/linearLayout3" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1">
<ImageView android:id="@+id/imageView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
<ImageView android:id="@+id/imageView2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
</LinearLayout>
<LinearLayout android:id="@+id/linearLayout4" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"></LinearLayout>
</LinearLayout>
<LinearLayout android:id="@+id/linearLayout2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"></LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
(在Eclipse布局编辑器中,图像被垂直剪切而根本没有缩放 - 但这只是我们学会爱的那些特性之一)
在硬件上运行时,图像会缩放到正确的高度,同时保留其纵横比.我的问题是他们不是彼此相邻的.每个ImageView的高度正确匹配LinearLayout的高度.每个ImageView的宽度是未缩放图像的宽度 - 实际按比例缩小的图像出现在其ImageView的左侧.因此,我在图像之间会有很大的差距.
理想情况下,我想通过XML来管理这个,如果这是不可能的,我理解使用自定义视图可能是最好的解决方案.
我尝试创建一个IconView(扩展ImageView)类来覆盖onMeasure,这样我就可以通过根据高度缩放宽度来创建所需大小的图像视图.但是传递给函数的parentWidth和parentHeight是屏幕的尺寸而不是LinearLayout容器的尺寸.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
// Calculations followed by calls to setMeasuredDimension, setLayoutParams
super.onMeasure(widthMeasureSpec, heightMeasureSpec); …
Run Code Online (Sandbox Code Playgroud) 我试图MyCustomView
使用ViewController.swift中的以下代码从另一个类访问..
var view = MyCustomView(frame: CGRectZero)
Run Code Online (Sandbox Code Playgroud)
..在viewDidLoad
方法中.问题是视图没有在模拟器中初始化.
我已经在当前的ViewController的storyboard中设置了类.
class MyCustomView: UIView {
var label: UILabel = UILabel()
var myNames = ["dipen","laxu","anis","aakash","santosh","raaa","ggdds","house"]
override init(){
super.init()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.addCustomView()
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func addCustomView() {
label.frame = CGRectMake(50, 10, 200, 100)
label.backgroundColor=UIColor.whiteColor()
label.textAlignment = NSTextAlignment.Center
label.text = "test label"
label.hidden=true
self.addSubview(label)
var btn: UIButton = UIButton()
btn.frame=CGRectMake(50, 120, 200, 100)
btn.backgroundColor=UIColor.redColor()
btn.setTitle("button", forState: UIControlState.Normal) …
Run Code Online (Sandbox Code Playgroud) 所述的Android数据绑定导向讨论了一个活动或片段内结合的值,但是有执行数据与自定义视图结合的方法吗?
我想做的事情如下:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.mypath.MyCustomView
android:id="@+id/my_view"
android:layout_width="match_parent"
android:layout_height="40dp"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
用my_custom_view.xml
:
<layout>
<data>
<variable
name="myViewModel"
type="com.mypath.MyViewModelObject" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{myViewModel.myText}" />
</LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
虽然看起来可以通过在自定义视图上设置自定义属性来实现这一点,但如果要绑定很多值,这很快就会变得很麻烦.
有没有一个好方法来完成我想要做的事情?
我的应用程序使用相机,我想在相机预览中添加叠加.例如,我想在使用相机时使用相框,我也想为相机操作添加自定义条.请帮我做同样的事.
我见过ApiDemos的com.example.android.apis.view.List11示例.在该示例中,每行采用视图android.R.simple_list_item_multiple_choice.每个这样的视图都有a TextView
和a CheckBox
.
现在我希望每个视图都有2 TextView
s和1 CheckBox
,有点类似于List3示例.我尝试像这样创建一个自定义布局文件row.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<CheckBox
android:id="@+id/checkbox"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="fill_parent" />
<TextView
android:id="@+id/text_name"
android:textSize="13px"
android:textStyle="bold"
android:layout_toLeftOf="@id/checkbox"
android:layout_alignParentLeft="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/text_phone"
android:textSize="9px"
android:layout_toLeftOf="@id/checkbox"
android:layout_below="@id/text_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
然后在Activity
s中onCreate()
,我喜欢这样:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Query the contacts
mCursor = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null);
startManagingCursor(mCursor);
ListAdapter adapter = new SimpleCursorAdapter(this,
R.layout.row,
mCursor,
new …
Run Code Online (Sandbox Code Playgroud) 我正在学习如何使用以下自定义视图:
http://developer.android.com/guide/topics/ui/custom-components.html#modifying
描述说:
类初始化与往常一样,首先调用super.此外,这不是默认构造函数,而是参数化构造函数.当EditText从XML布局文件中膨胀时,会使用这些参数创建EditText,因此,我们的构造函数需要同时接受它们并将它们传递给超类构造函数.
有更好的描述吗?我一直试图弄清楚构造函数应该是什么样子,我想出了4种可能的选择(参见帖子末尾的例子).我不确定这4个选择是做什么(或不做什么),为什么要实现它们,或者参数是什么意思.有这些的描述吗?
public MyCustomView()
{
super();
}
public MyCustomView(Context context)
{
super(context);
}
public MyCustomView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public MyCustomView(Context context, AttributeSet attrs, Map params)
{
super(context, attrs, params);
}
Run Code Online (Sandbox Code Playgroud) 我有一个自定义View运行一个Thread操作,它定期调用interwebs.我想知道是否有一种方法让我不必从父Activity(onPause)中删除该线程,以便Thread在后台(和/或被杀死)后不在后台进行铣削.
这里的意图是自定义View是自给自足的,不需要从Activity中进行额外处理.这样做的方法是让它在其父级被后台时监听,然后让它在线程中的无限睡眠循环到期.我没有看到这样做的方法,但我希望我忽略了一些东西.
我需要能够访问视图画布的大小来执行一些计算.由于某种原因,传递给的视图onSizeChanged
的大小不同于传递给的画布的大小onDraw
.我当前的解决方法使用布尔标志来确定何时需要进行计算.
理想的解决方案将允许我在onSizeChanged
方法中进行这些计算,所以我想知道......有什么办法可以Canvas
在onDraw
方法之外得到对象(或者至少它的维度)吗?
我的代码如下.它以给定角度绘制圆的半径.当我canvas.centerX()
用来确定半径的起点和终点时,一切都很完美.如果我使用传入的参数onSizeChanged
,它甚至远程接近正确.
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mSizeChanged = true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mSizeChanged) {
RectF bounds = new RectF(canvas.getClipBounds());
float centerX = bounds.centerX();
float centerY = bounds.centerY();
float radianAngle = (float) Math.toRadians(mStartAngle);
mRadius[0] = center;
mRadius[1] = center;
mRadius[2] = center + center * FloatMath.cos(radianAngle);
mRadius[3] = …
Run Code Online (Sandbox Code Playgroud) 我最初问过这个问题.我假设自定义视图加载时间缓慢的原因是因为将多个视图叠加在一起或者可能是因为一些递归问题.然而,在删除越来越多的代码以查看会产生什么影响后,可归结为我是否有UITextView
礼物.因为我的问题的明显来源与我在第一个问题中所期望的那么不同,所以我决定开始一个新问题,而不是对旧问题添加冗长的更新.
我用两个视图控制器设置我的测试项目.第一个视图控制器上的按钮将show segue调用到第二个视图控制器.第二个视图控制器上有我的自定义视图.(使用第二个视图控制器让我了解加载自定义视图所需的时间.)
自定义视图代码:
import UIKit
@IBDesignable class UIMongolTextView: UIView {
var textView = UITextView() // key line
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect){
super.init(frame: frame)
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,唯一的区别UIView
是我添加了一个UITextView
属性.而且这种自定义视图加载速度非常慢.在Instruments中运行Allocations工具我得到以下结果(计数为997):
但是,如果我注释掉这条线
//var textView = UITextView()
Run Code Online (Sandbox Code Playgroud)
然后我自定义视图加载非常快,只有7的计数.
这里发生了什么?是否可以UITextView
在自定义视图中使用属性并避免这种缓慢的加载时间?
custom-view ×10
android ×7
ios ×3
swift ×2
attr ×1
camera ×1
data-binding ×1
enums ×1
formatting ×1
imageview ×1
layout ×1
listview ×1
objective-c ×1
performance ×1
uitextview ×1
view ×1
xcode ×1
xml ×1