当前位置:首页 » 安卓系统 » android自定义组件

android自定义组件

发布时间: 2022-01-30 18:32:14

⑴ android 自定义组件怎样在布局中声明

你可以get父控件的layoutparams,然后取到里面的高,然后通过这个高,来定义一个layoutparams, set给你的textView便得了,我写的方法给你参考下:
/**
* 将传进来view的布局参数按照比例缩放,以适应不同的屏幕大小,这里处理了RelativeLayout、FrameLayout、
* LinearLayout三种容器里View的布局参数,如有需要可自行增减,其中的scaleWidth=现设备宽/原设备宽
* scaleHeight = 现设备高/原设备高,这个需要用displaymetrics类来取
* @param view
* @param scaleWidth
* @param scaleHeight
*/
public static void setParams(View view, float scaleWidth, float scaleHeight) {
RelativeLayout.LayoutParams rlParams = null;
FrameLayout.LayoutParams flParams = null;
LinearLayout.LayoutParams llParams = null;
if (view.getParent() instanceof RelativeLayout) {
rlParams = (RelativeLayout.LayoutParams) (view.getLayoutParams());
rlParams.width = (int) (rlParams.width * scaleWidth);
rlParams.height = (int) (rlParams.height * scaleHeight);
rlParams.leftMargin = (int) (rlParams.leftMargin * scaleWidth);
rlParams.rightMargin = (int) (rlParams.rightMargin * scaleWidth);
rlParams.topMargin = (int) (rlParams.topMargin * scaleHeight);
rlParams.bottomMargin = (int) (rlParams.bottomMargin * scaleHeight);
view.setLayoutParams(rlParams);
} else if (view.getParent() instanceof FrameLayout) {
flParams = (FrameLayout.LayoutParams) (view.getLayoutParams());
flParams.width = (int) (flParams.width * scaleWidth);
flParams.height = (int) (flParams.height * scaleHeight);
flParams.leftMargin = (int) (flParams.leftMargin * scaleWidth);
flParams.rightMargin = (int) (flParams.rightMargin * scaleWidth);
flParams.topMargin = (int) (flParams.topMargin * scaleHeight);
flParams.bottomMargin = (int) (flParams.bottomMargin * scaleHeight);
view.setLayoutParams(flParams);
} else if (view.getParent() instanceof LinearLayout) {
llParams = (LinearLayout.LayoutParams) (view.getLayoutParams());
llParams.width = (int) (llParams.width * scaleWidth);
llParams.height = (int) (llParams.height * scaleHeight);
llParams.leftMargin = (int) (llParams.leftMargin * scaleWidth);
llParams.rightMargin = (int) (llParams.rightMargin * scaleWidth);
llParams.topMargin = (int) (llParams.topMargin * scaleHeight);
llParams.bottomMargin = (int) (llParams.bottomMargin * scaleHeight);
view.setLayoutParams(llParams);
}
}

⑵ android自定义控件怎么用

一、控件自定义属性介绍
以下示例中代码均在values/attrs.xml 中定义,属性均可随意命名。
1. reference:参考某一资源ID。
示例:
<declare-styleable name = "名称">

<attr name = "background" format = "reference" />
<attr name = "src" format = "reference" />
</declare-styleable>

2. color:颜色值。
示例:
<declare-styleable name = "名称">

<attr name = "textColor" format = "color" />
</declare-styleable>

3. boolean:布尔值。
示例:
<declare-styleable name = "名称">

<attr name = "focusable" format = "boolean" />
</declare-styleable>

4. dimension:尺寸值。
示例:
<declare-styleable name = "名称">

<attr name = "layout_width" format = "dimension" />
</declare-styleable>

5. float:浮点值。
示例:
<declare-styleable name = "名称">

<attr name = "fromAlpha" format = "float" />
<attr name = "toAlpha" format = "float" />
</declare-styleable>

6. integer:整型值。
示例:
<declare-styleable name = "名称">

<attr name = "frameDuration" format="integer" />
<attr name = "framesCount" format="integer" />
</declare-styleable>

7. string:字符串。
示例:
<declare-styleable name = "名称">

<attr name = "text" format = "string" />
</declare-styleable>

8. fraction:百分数。
示例:

<declare-styleable name="名称">
<attr name = "pivotX" format = "fraction" />
<attr name = "pivotY" format = "fraction" />
</declare-styleable>

9. enum:枚举值。
示例:
<declare-styleable name="名称">

<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
</declare-styleable>

10. flag:位或运算。
示例:
<declare-styleable name="名称">

<attr name="windowSoftInputMode">
<flag name = "stateUnspecified" value = "0" />
<flag name = "stateUnchanged" value = "1" />
<flag name = "stateHidden" value = "2" />
<flag name = "stateAlwaysHidden" value = "3" />
</attr>
</declare-styleable>

11.多类型。
示例:

<declare-styleable name = "名称">
<attr name = "background" format = "reference|color" />
</declare-styleable>

二、属性的使用以及自定义控件的实现
1、构思控件的组成元素,思考所需自定义的属性。
比如:我要做一个 <带阴影的按钮,按钮正下方有文字说明>(类似9宫格按钮)
新建values/attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="custom_view">
<attr name="custom_id" format="integer" />
<attr name="src" format="reference" />
<attr name="background" format="reference" />
<attr name="text" format="string" />
<attr name="textColor" format="color" />
<attr name="textSize" format="dimension" />
</declare-styleable>
</resources>

以上,所定义为custom_view,custom_id为按钮id,src为按钮,background为阴影背景,text为按钮说明,textColor为字体颜色,textSize为字体大小。

2、怎么自定义控件呢,怎么使用这些属性呢?话不多说请看代码,CustomView :

package com.nanlus.custom;
import com.nanlus.custom.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
public class CustomView extends FrameLayout implements OnClickListener {
private CustomListener customListener = null;
private Drawable mSrc = null, mBackground = null;
private String mText = "";
private int mTextColor = 0;
private float mTextSize = 20;
private int mCustomId = 0;
private ImageView mBackgroundView = null;
private ImageButton mButtonView = null;
private TextView mTextView = null;
private LayoutParams mParams = null;
public CustomView(Context context) {
super(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.custom_view);
mSrc = a.getDrawable(R.styleable.custom_view_src);
mBackground = a.getDrawable(R.styleable.custom_view_background);
mText = a.getString(R.styleable.custom_view_text);
mTextColor = a.getColor(R.styleable.custom_view_textColor,
Color.WHITE);
mTextSize = a.getDimension(R.styleable.custom_view_textSize, 20);
mCustomId = a.getInt(R.styleable.custom_view_custom_id, 0);
mTextView = new TextView(context);
mTextView.setTextSize(mTextSize);
mTextView.setTextColor(mTextColor);
mTextView.setText(mText);
mTextView.setGravity(Gravity.CENTER);
mTextView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
mButtonView = new ImageButton(context);
mButtonView.setImageDrawable(mSrc);
mButtonView.setBackgroundDrawable(null);
mButtonView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
mButtonView.setOnClickListener(this);
mBackgroundView = new ImageView(context);
mBackgroundView.setImageDrawable(mBackground);
mBackgroundView.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
addView(mBackgroundView);
addView(mButtonView);
addView(mTextView);
this.setOnClickListener(this);
a.recycle();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mParams = (LayoutParams) mButtonView.getLayoutParams();
if (mParams != null) {
mParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
mButtonView.setLayoutParams(mParams);
}
mParams = (LayoutParams) mBackgroundView.getLayoutParams();
if (mParams != null) {
mParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
mBackgroundView.setLayoutParams(mParams);
}
mParams = (LayoutParams) mTextView.getLayoutParams();
if (mParams != null) {
mParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
mTextView.setLayoutParams(mParams);
}
}
public void setCustomListener(CustomListener l) {
customListener = l;
}
@Override
public void onClick(View v) {
if (customListener != null) {
customListener.onCuscomClick(v, mCustomId);
}
}
public interface CustomListener {
void onCuscomClick(View v, int custom_id);
}
}
代码很简单,就不多说,下面来看看我们的CustomView是怎么用的,请看:

3、自定义控件的使用
话不多说,请看代码,main.xml:
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:nanlus="http://schemas.android.com/apk/res/com.nanlus.custom"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:orientation="horizontal" >
<com.nanlus.custom.CustomView
android:id="@+id/custom1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
nanlus:background="@drawable/background"
nanlus:custom_id="1"
nanlus:src="@drawable/style_button"
nanlus:text="按钮1" >
</com.nanlus.custom.CustomView>
</LinearLayout>
</RelativeLayout>

在这里需要解释一下,
xmlns:nanlus="http://schemas.android.com/apk/res/com.nanlus.custom"
nanlus为在xml中的前缀,com.nanlus.custom为包名

4、在Activity中,直接上代码
package com.nanlus.custom;

import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.nanlus.BaseActivity;
import com.nanlus.custom.R;
import com.nanlus.custom.CustomView.CustomListener;
public class CustomActivity extends BaseActivity implements CustomListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
((CustomView) this.findViewById(R.id.custom1)).setCustomListener(this);
}
@Override
public void onCuscomClick(View v, int custom_id) {
switch (custom_id) {
case 1:
Toast.makeText(this, "hello !!!", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
}

⑶ Android 自定义控件 动态设置高度

Android动态改变View控件大小的方法:
1、声明控件参数获取对象 LayoutParams lp;
2、获取控件参数: lp = 控件id.getLayoutParams();
3、设置控件参数:如高度。 lp.height -= 10;
4:、使设置生效:控件id.setLayoutParams(lp);
例如如要把Imageview下移200px: ImageView.setPadding( ImageView.getPaddingLeft(), ImageView.getPaddingTop()+200, ImageView.getPaddingRight(), ImageView.getPaddingBottom());

⑷ android中怎样实现自定义控件中的组合控件

public
class
MyView
extends
View{
//
此处省略
构造方法
private
void
onDraw(Canvas
canvas){
//重写view的onDraw方法,绘制控件的样式
//这里你使用canvas来绘制,你布局中使用这个控件就是你绘制的样子
}
//然后你可以定义很多自己的一些方法,用来修改控件的样式
//假如你自定义的一个
进度条
的话,就要修改进度条值,你就可以自定义方法,让实现对象来改变进度值,记得修改后调用validate方法更新显示。(具体函数记不太清了)
}
大概就是这样实现的自定义控件,自定义控件的话优化是很重要的哦,不然性能会很差。
然后你要使用这个控件的话,在布局中就需要这样定义,假如这个自定义控件类是这样的:
xxx.xxx.MyView。
则使用时:

⑸ android 开发怎么导入自定义组件

复制你自定义的组件的类的限定名,然后用这么限定名在xml文件中就可一用来定义了,比如我自定义的组件位置是com.test.test.MyView,就可以这样定义
<com.test.test.MyView
这里面一样可以设置id,宽高属性什么的。

/>

⑹ android中 自定义了一个View类, 在xml布局文件中作为组件添加(无错误提示)但运行后报错

引用自定义view带上全包名,如
<com.project.customcontrol.MyView
android:layout_width="match_parent"
android:layout_height="match_parent"/>

⑺ android 自定义控件 自定义控件 区别

你在layout布局的时候使用的什么Button啊,TextView啊之类的就是系统控件,自己定义的控件的话是通过继承View类来实现的。

java">publicclassMyViewextendsView{
//此处省略构造方法

privatevoidonDraw(Canvascanvas){
//重写view的onDraw方法,绘制控件的样式
//这里你使用canvas来绘制,你布局中使用这个控件就是你绘制的样子
}

//然后你可以定义很多自己的一些方法,用来修改控件的样式
//假如你自定义的一个进度条的话,就要修改进度条值,你就可以自定义方法,让实现对象来改变进度值,记得修改后调用validate方法更新显示。(具体函数记不太清了)
}

大概就是这样实现的自定义控件,自定义控件的话优化是很重要的哦,不然性能会很差。
然后你要使用这个控件的话,在布局中就需要这样定义,假如这个自定义控件类是这样的:
xxx.xxx.MyView。
则使用时:
<xxx.xxx.MyView
这些地方一样的设置宽高,id啊杂七杂八的属性

/>

⑻ android自定义控件继承View,其中父类的三个构造方法有什么区别

在代码里new的话一般用一个参数的,
写在xml里的 调用2个参数的 attr里边传过来的是 xml里边对应的height width等参数,包括自己定义的参数,如果在xml里边写入自定义控件的话 必须要重写2个参数的构造函数

第3个参数不熟,传style的吧貌似

⑼ android自定义组件的ondraw

这是坐标计算有错吧,android的canvas和bitmap都是以左上角点为坐标原点,所以你的第一个drawBitmap是能画出东西来,但是第二个是从canvas的右上角点开始画,第三个和第四个是从左下角点开始画,结果都画到canvas外面去了。
如果要画在canvas里面,计算画图的起始点的时候要把bitmap的宽和高也考虑进去,比如
第二个应该是
canvas.drawBitmap(mRightBitmap, getRight()-mRightBitmap.getWidth(), 0, paint);
第三个应该是
canvas.drawBitmap(mBottomBitmap, 0, getBottom()-mBottomBitmap.getHeight(), paint);
其他的以此类推。

热点内容
android64位开发环境 发布:2025-01-20 01:58:01 浏览:261
阿里云服务器能搭美国站点 发布:2025-01-20 01:49:34 浏览:276
安卓手机壁纸如何更换成动态壁纸 发布:2025-01-20 01:40:27 浏览:705
安卓微信签名在哪里修改 发布:2025-01-20 01:25:31 浏览:109
安卓电脑管家怎么恢复出厂设置 发布:2025-01-20 01:24:06 浏览:313
qt编译sqlite库 发布:2025-01-20 01:22:30 浏览:525
360摄像头存储设置 发布:2025-01-20 01:16:01 浏览:538
js防缓存 发布:2025-01-20 01:15:47 浏览:495
编程生日卡 发布:2025-01-20 01:15:14 浏览:206
android备忘录源码 发布:2025-01-20 01:06:32 浏览:455