2017-04-12 15:38:23 changsha_giser 阅读数 1085
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19531 人正在学习 去看看 任苹蜻

作者:程溯

在移动GIS应用采集中对数据进行采集编辑添加属性值操作。
数据编辑主要包括图形的编辑与属性的编辑:可以绘制新的GeoPoint、GeoLine、GeoRegion对象添加其属性,也可选择已有对象,编辑其属性,或者删除选中对象。

主要介绍用到的俩个地图控件监听GeometryAddedListener和GeometrySelectedListener的用法。

GeometryAddedListener接口:用于接收添加几何对象事件(GeometryEvent)的监听器。
类 GeometryEvent:指示几何对象编辑的事件。

几何对象编辑事件包括:GeometryDeleting,GeometryAdded,GeometryModifying 和 GeometryModified。当几何对象被编辑时触发该事件。

GeometrySelectedListener接口:用于接收选中几何对象事件(GeometrySelectedEvent)的监听器。

类 GeometrySelectedEvent:指示几何对象被选中的事件。 当地图窗口中的几何对象被选中后触发该事件。该事件只在 UI 操作(如鼠标操作)或模拟 UI 操作(如 Map 的 DoMouseDown 方法等)时触发,使用代码操作 Selecttion 将不会触发该事件。

接收添加几何对象事件及选中几何对象事件:

    @Override
    public void geometrySelected(GeometrySelectedEvent arg0) {
        // TODO Auto-generated method stub
        layer = arg0.getLayer();
        curEvent1 = arg0.getGeometryID();
        mapControl.appointEditGeometry(curEvent1, layer);
    }

    @Override
    public void geometryAdded(GeometryEvent arg0) {
        if (mapControl.getCurrentGeometry() != null) {
            curEvent = arg0.getID();
            Intent intent = new Intent(getBaseContext(), InfoWnd.class);
            startActivityForResult(intent, REQUEST_INFO);
            mapControl.setAction(Action.PAN);
            return;
        }

    }

添加几何对象:

        add_dian= (Button) findViewById(R.id.add_dian);
        add_dian.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                mapControl.setAction(Action.CREATEPOINT);
                layer = mapControl.getMap().getLayers().get(0);
                layer.setEditable(true);
                mapControl.getMap().refresh();
            }
        });
        add_line= (Button) findViewById(R.id.add_line);
        add_line.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mapControl.setAction(Action.CREATEPOLYLINE);
                layer = mapControl.getMap().getLayers().get(1);
                layer.setEditable(true);
                mapControl.getMap().refresh();
            }
        });

        add_mian = (Button) findViewById(R.id.add_mian);
        add_mian.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                mapControl.setAction(Action.CREATEPOLYGON);
                layer = mapControl.getMap().getLayers().get(2);
                layer.setEditable(true);
                mapControl.getMap().refresh();
            }
        });

添加几何对象之后添加其属性:

private void XXX(String strName, String strDetail) {
        try {
            if (datasetVector == null) {
                return;
            }
            DatasetVector datasetVector = (DatasetVector) layer.getDataset();
            String strFilter = "SmID = " + String.valueOf(curEvent);
            Recordset recordset = null;
            recordset = datasetVector.query(strFilter, CursorType.DYNAMIC);
            recordset.edit();

            if (!strName.isEmpty()) {
                recordset.setFieldValue("name", strName);
            }
            if (!strDetail.isEmpty()) {
                recordset.setFieldValue("type", strDetail);
            }
            recordset.update();
            recordset.close();
            recordset.dispose();

            mapControl.getMap().refresh();
        } catch (Exception e) {
            Log.e("MyPoit", e.getMessage());
        }
    }

弹窗显示属性编辑:

private void XXX() {
        int pvY = (mapControl.getMap().getImageSizeHeight() - 300) / 2;
        int pvX = (mapControl.getMap().getImageSizeWidth() - 250) / 2;

        Recordset recordset = layer.getSelection().toRecordset();
        recordset.moveFirst();
        String strName = "";
        String strType = "";
        Object object1 = recordset.getFieldValue("name");
        Object object2 = recordset.getFieldValue("type");
        if (object1 != null) {
            strName = object1.toString();
        }
        if (object2 != null) {
            strType = object2.toString();
        }
        mEditName.setText(strName);
        mEditType.setText(strType);
        pwNameView.showAtLocation(mapControl, Gravity.NO_GRAVITY, pvX, pvY);
private void XXX() {
        String name = mEditName.getText().toString();
        String type = mEditType.getText().toString();
        DatasetVector datasetVector = (DatasetVector) layer.getDataset();
        String strFilter = "SmID = " + String.valueOf(curEvent1);
        Recordset recordset = null;
        recordset = datasetVector.query(strFilter, CursorType.DYNAMIC);
        recordset.edit();
        if (!name.isEmpty()) {
            recordset.setFieldValue("name", name);
        }
        if (!type.isEmpty()) {
            recordset.setFieldValue("type", type);
        }
        recordset.update();
        recordset.dispose();
        mapControl.getMap().refresh();

    }

效果截图:
这里写图片描述 这里写图片描述 这里写图片描述
这里写图片描述 这里写图片描述

到这里就结束了,如果大家还有什么问题请留言,感谢关注changsha_giser博客。

2015-02-06 10:41:02 xiabing082 阅读数 484
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19531 人正在学习 去看看 任苹蜻
androidの自定义view属性资源
1. 添加自定义View的属性文件
在res/values中新建attrs.xml文件(文件名可另取,不过推荐用attrs.xml,可以将自定义属性都放入其中),内容为
属性资源文件的根元素也是 <resources.../>,该元素包含两个子元素:
   attr 子元素:定义一个属性。
   declare-styleable 子元素:定义一个styleable对象,每个styleable对象就是一组attr属性的集合。
<?xml version="1.0" encoding="utf-8"?>
<resources>
	<!-- 定义一个属性 -->
	<attr name="duration">
	</attr>
	<!-- 定义一个styleable对象来组合多个属性 -->
	<declare-styleable name="AlphaImageView">
		<attr name="duration"/>
	</declare-styleable>
</resources>
这里定义的属性 duration, 对应布局文件中使用的属性:crazyit:duration, 在这里可以指定值:
<attr name="duration" format="integer"/>
同时,上面定义的 AlphaImageView, 随意命名的,但是对应Java代码中AttributeSet对象获取的属性。
然后看下布局文件代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:crazyit="http://schemas.android.com/apk/res/org.crazyit.res"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- 使用自定义组件,并指定属性资源中定义的属性 -->
    <org.crazyit.res.AlphaImageView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/ee"
        crazyit:duration="60000" />

</LinearLayout>
public class AlphaImageView extends ImageView{
	// 图像透明度每次改变的大小
	private int alphaDelta = 0;
	// 记录图片当前的透明度。
	private int curAlpha = 0;
	// 每隔多少毫秒透明度改变一次
	private final int SPEED = 300;
	Handler handler = new Handler()
	{
		@Override
		public void handleMessage(Message msg)
		{
			if (msg.what == 0x123)
			{
				// 每次增加curAlpha的值
				curAlpha += alphaDelta;
				if (curAlpha > 255) curAlpha = 255;
				// 修改该ImageView的透明度
				AlphaImageView.this.setAlpha(curAlpha);
			}
		}
	};
	public AlphaImageView(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		TypedArray typedArray = context.obtainStyledAttributes(attrs,
				R.styleable.AlphaImageView);
		// 获取duration参数
		int duration = typedArray
				.getInt(R.styleable.AlphaImageView_duration, 0);
		// 计算图像透明度每次改变的大小
		alphaDelta = 255 * SPEED / duration;
	}

	@Override
	protected void onDraw(Canvas canvas)
	{
		this.setAlpha(curAlpha);
		super.onDraw(canvas);
		final Timer timer = new Timer();
		// 按固定间隔发送消息,通知系统改变图片的透明度
		timer.schedule(new TimerTask()
		{
			@Override
			public void run()
			{
				Message msg = new Message();
				msg.what = 0x123;
				if (curAlpha >= 255)
				{
					timer.cancel();
				}
				else
				{
					handler.sendMessage(msg);
				}
			}
		}, 0, SPEED);
	}
}
注意到:获取了定义的 AlphaImageView 时定义的duration属性,并根据该属性计算图片的透明度的变化幅度,接着重写OnDraw(),启动来控制图片的变化。

2. 代码下载地址

   更多自定义view 代码

 
2018-05-26 10:15:13 freak_csh 阅读数 1461
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19531 人正在学习 去看看 任苹蜻
       // 新建一个可以添加属性的文本对象
        SpannableString ss = new SpannableString(getResources().getString(R.string.ConvertAct_num));
// 新建一个属性对象,设置文字的大小
        AbsoluteSizeSpan ass = new AbsoluteSizeSpan(15, true);
// 附加属性到文本
        ss.setSpan(ass, 0, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置hint
        edt_convert_num.setHint(new SpannedString(ss)); // 一定要进行转换,否则属性会消失
2011-03-04 10:26:45 qq6513568061 阅读数 15
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19531 人正在学习 去看看 任苹蜻
android中View对象的创建可以在代码中创建,也可以在布局文件中声明,在布局文件中声明时,可以对在布局文件中添加属性,如: android:layout_width="fill_parent" 。属性包括两个部分:android和layout_width,android是命名空间,layout_width是属性名,我们可以在View上添加任意不带前缀的属性如:
<View android:layout_width="44dip" android:layout_height="0dip" anyproperty="value" />, 上面的代码不会报任何的错误,但是这样做并没有任何的实际意义。
View中要想自己生命的属性有意义,则需要为属性加一个命名空间前缀,在布局文件中直接给View加前缀是不允许的,如:<Button myxmlns:anyproperty="value" /> 这样的代码在IDE中会直接报错,并提示无该命名空间,要想使得该命名空间有效,则需要在使用该命名空间之前生命该命名空间,方式如下:
<View xmlns:myxmlns="ssss" />
<View xmlns:myxmlns="ssss" />

有了如上的生命,我们就可以有如下的代码而使得IDE不会报告任何错误:<View xmlns:myxmlns="sss" myxmlns:anyproperty="value" />

在实际应用中大多数的自定义命名空间都声明在第一个元素中,如:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:myxmlns="ssss"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

ss="" />

<View myxmlns:sss="sss" />

</LinearLayout>

但这些声明不会使得IDE报错,但其实也是没有任何意义的。因为这里的命名空间的值sss是任意定义的,我们要使得它看起来有意义,我们一般使用如下的值 xmlns:myxmlns=""http://schemas.android.com/apk/res/<你的应用程序的包名>",同时我们还需要在values目录下创建一个attrs.xml的文件,文件的内容看起来像这样的:

<resources>

<declare-styleable name="LabelView">

<attr name="text" format="string" />

<attr name="textColor" format="color" />

</declare-styleable>

</resources>
这时如果你使用以下的布局文件IDE就会报错了

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:myxmlns="http://schemas.android.com/apk/res/com.zbkc.custumview"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<TextView android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello" />

<View myxmlns:sss="sss" />

</LinearLayout>

他会在 <View myxmlns:sss="ssss" />这一行提示myxmlns的命名空间下sss这个属性

但我们可以使用如下的布局文件而不会报错:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:myxmlns="http://schemas.android.com/apk/res/com.zbkc.custumview"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<TextView android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello" />

<View myxmlns:text="sss"

myxmlns:textColor="#ffffffff"/>

</LinearLayout>
因为text和textColor属性在前面的布局文件中已经被声明。



实际上给任何 android自带的控件增加自定义属性都是无意义的做法,但对于自定义的View(继承自View的类)来增加自定义的属性却是有很大的实际意义的,如,我们可能经常看到有如下的声明:

<MyView android:layout_width="fill_parent"

android:layout_height="fill_parent"

myxmlns:anyproperty="value" />

这就是为自定义的View添加了额外的属性,但是刚有了我们前面的声明,并没有什么实际的意义,因为只是做到了声明IDE不报错,并没有任何实际的意义,我们现在要做的就是如何在自定义的View中(注意,只能在自定义的View中来取得这些值)取得我们在布局文件中声明的属性值。

我们下面来写一个稍微完整一点的代码来演示一下完整的过程:

java代码

class LabelView extends View {

private String text;

private int textColor;

public LabelView(Context context, AttributeSet attrs) {

super(context, attrs);

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LabelView);

text = (String)a.getText(R.styleable.LabelView_text);

textColor = a.getColor(R.styleable.LabelView_textColor, 0xff000000);

Log.i("test", "text:" + text);

Log.i("test", "textColor:" + textColor);

a.recycle();

}

}

Xml声明

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:myxmlns="http://schemas.android.com/apk/res/com.zbkc.custumview"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<com.zbkc.custumview.LabelView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

myxmlns:text="sss"

myxmlns:textColor="#ff00ff00" />

</LinearLayout>
我们另外再加一个入口代码就可以发现可以取得我们自定义声明的值了
2016-05-20 18:00:01 cfp6523052 阅读数 270
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19531 人正在学习 去看看 任苹蜻

前言

Property Animation是Android3.0引入的一种功能强大的动画系统。它除了可以给普通的View添加动画效果外,还可以给对象添加效果。另外,Property Animation与Tween Animation一个最大的区别是Property Animation更改是对象的实际属性,而后者只是View的绘制效果,比如一个Button实现一个移动的动画效果,如果使用Tween Animation 的话,Button 的点击位置并不会随着动画的移动效果儿移动。换句话说在新位置Button是可能没有点击事件的。使用Property Animation可以设置下面的一些动画特性:

  • Duration: 动画之间的间隔

  • Time interpolation: 属性值的变化方式,可以表示为动画的事件函数,例如线性动画,加速动画等等。

  • Repeat count and behavior: 动画的重复次数和重复方式。

  • Animation sets: 动画集合

  • Frame refresh delay: 帧刷新间隔,默认是10ms,但具体的速度依赖于系统的繁忙程度。

属性动画的工作原理

图1描绘了一个假象的对象x属性的动画,它给出了该对象在屏幕水平方法的位置,在40ms内改对象移动了40个像素。每10ms记录一次对象移动的像素,这个动画是的Time interpolation是liearinterpolation,表明动画是以恒定的速度移动的。

图1

在Property Animation中,ValueAnimator是其核心类,它记录了动画自身的一些属性值。图2是其工作流程:

图2

动画在整个过程中,会根据我们当初设置的TimeInterpolator和TypeEvaluator的计算方式计算出不通的属性值,从而不断的改变属性值的大小,就会产生各式各样的动画效果。

下面就通过一个实例理解一下什么是TimeInterpolator和TypeEvaluator.

  • TimeInterpolator

TimeInterpolator翻译过来是插值器,插值器定义了动画变化中的属性变化规则,它根据时间比例因子计算出一个插值因子,那么什么是时间比例因子呢,简单讲就是:


时间比例因子 = 动画已执行的时间 / 动画执行的总时间


而插值因子,用于设定动画是线性变化,还是非线性变化等千万中变化,你可以通过实现TimeInterpolator来实现自己的插值器(在>sdk22可以继承抽象类BaseInterpolator)。Android中默认的定义很多的插值器:

  1. AccelerateDecelerateInterpolator

    在开始和结束时速度较慢

  2. AccelerateInterpolator

    加速变化

  3. LinearInterpolator

    匀速变化

更多的插值器,可以在这里查看.


//自定义插值器
class MyInterpolator implements TimeInterpolator{


    @Override
    public float getInterpolation(float input) {
        //自定义的规则
        return 0;
    }
}



  • TypeEvaluator

TypeEvaluator是根据插值因子去计算属性值,Android默认可以识别的类型为int, float和颜色,分别是

IntEvalutor, FloatEvalutor, ArgbEvaluator.

  1. IntEvalutor

    计算整数型

  2. FloatEvalutor

    计算浮点型

  3. ArgbEvaluator

    计算颜色属性




//自定义TypeEvaluator
class MyTypeEvaluator implements TypeEvaluator<Ball>{


    @Override
    public Ball evaluate(float fraction, Ball startValue, Ball endValue) {
        //自己的规则
        return null;
    }
}

下面以三个小球的旋转效果为例,了解一下属性动画的整个实现过程。

效果图

源码可以看这里

Android 属性动画

阅读数 11

android装饰者模式

阅读数 123

java asm 添加属性

阅读数 2920

没有更多推荐了,返回首页