安卓 平移+缩放 指定宽度 ,小数点缩放比例,处理缩放后坐标。

本文介绍了一个使用Android的RelativeLayout和Button组件实现视图动画的示例。通过改变按钮的大小和位置,展示了如何使用ScaleAnimation和TranslateAnimation创建动态效果。文章详细解释了动画设置、参数调整及布局参数更新的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  <RelativeLayout
        android:id="@+id/rl_content"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:background="@color/colorAccent">

        <Button
            android:id="@+id/bt_click"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="哈哈哈" />
    </RelativeLayout>

    <Button
        android:id="@+id/bt1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="还原" />

    <Button
        android:id="@+id/bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:text="放大" />
public class MainActivity2 extends AppCompatActivity {
    RelativeLayout rlContent;
    float initWidth;
    float expectWidth;
    int tran;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Button bt = findViewById(R.id.bt);
        Button bt1 = findViewById(R.id.bt1);
        Button btClick = findViewById(R.id.bt_click);
        btClick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity2.this, "哈哈哈", Toast.LENGTH_SHORT).show();
            }
        });

        rlContent = findViewById(R.id.rl_content);
        rlContent.post(new Runnable() {
            @Override
            public void run() {
                initWidth = rlContent.getWidth();
            }
        });
        expectWidth = DisplayUtil.dip2px(MainActivity2.this, 200);
        tran = DisplayUtil.dip2px(MainActivity2.this, 150);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final float scale = expectWidth / initWidth;
                setAni(scale, tran, tran);
            }
        });
        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final float scale = initWidth / expectWidth;
                setAni(scale, 0, -tran);
            }
        });
    }

    public void setAni(float scale, int Magin, int Tran) {
        AnimationSet animationSet = new AnimationSet(true);
        animationSet.addAnimation(getScale(scale, Magin));
        animationSet.addAnimation(getTran(Tran));
        animationSet.setFillAfter(true);
        rlContent.startAnimation(animationSet);
    }

    public ScaleAnimation getScale(final float scale, final int Margin) {
        ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, scale, 1.0f, scale);
        scaleAnimation.setDuration(500);
        scaleAnimation.setFillAfter(true);
        scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                rlContent.clearAnimation();
                RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) rlContent.getLayoutParams();
                layoutParams.setMargins(Margin, Margin, 0, 0);
                layoutParams.width = (int) (layoutParams.width * scale);
                layoutParams.height = (int) (layoutParams.height * scale);
                rlContent.setLayoutParams(layoutParams);


            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        return scaleAnimation;
    }

    public TranslateAnimation getTran(float tran) {
        TranslateAnimation translateAnimation = new TranslateAnimation(0, tran, 0, tran);
        translateAnimation.setDuration(500);
        translateAnimation.setFillAfter(true);
        return translateAnimation;
    }
}

 

<think>好的,我现在需要解决用户的问题:在UniApp中如何将带有小数点的字符串类型坐标安全地转换为整数类型坐标而不丢失重要信息。首先,我得理解用户的具体需求。坐标通常是浮点数,比如经纬度,包含小数点。转换为整数可能会丢失精度,但用户希望不丢失重要信息,所以可能需要某种保留方法,比如缩放处理。 接下来,我需要考虑数据类型转换的基本原理。根据引用[1],Java(或类似语言)中,将大容量类型转换为小容量类型可能会报错,比如double转int会损失小数部分。UniApp使用的是JavaScript,所以需要了解JS的类型转换机制。JS中,字符串转整数可以用parseInt,但会直接截断小数部分,这可能不符合用户需求。 用户提到“安全地转换”,可能涉及保留小数部分的处理,比如乘以一个缩放因子(如1000)将小数转换为整数,存储时再除以缩放因子恢复。例如,12.345变成12345,存储为整数,使用时除以1000得到原值。这样可以避免精度丢失。 另外,引用[3]中提到检查字符串是否包含负号,这在坐标处理中也很重要,因为经纬度可能有负数。转换前需要处理符号问题,确保负数正确转换。 还要考虑字符串的格式是否正确,比如是否有非数字字符,是否需要处理千分位分隔符等。使用正则表达式清洗数据可能有必要,如引用[3]中的检查方法,确保传入的坐标格式正确。 然后,具体步骤可能是:1. 验证和清洗字符串,确保是有效的数字格式;2. 解析字符串为浮点数;3. 应用缩放因子转换为整数,同时处理负号;4. 存储整数,使用时恢复。 需要注意JavaScript的数值范围,整数类型的范围是否足够。JS的Number是双精度浮点,但转换为整数时,如果超出2^53精度可能丢失,但一般坐标数值不会那么大。 最后,代码实现部分需要考虑使用正则表达式去除无效字符,使用parseFloat转换,然后乘以缩放因子并取整。同时处理负数的情况,确保符号正确。例如,将"123.456"转换为123456,存储为整数,需要时除以1000。</think>### 解决方案:带小数点坐标字符串转整数类型 #### 核心思路 将浮点型坐标(如$12.345$)通过**缩放因子**转换为整数,存储时保留完整精度,使用时再还原为原始值。例如,使用缩放因子$1000$将$12.345$转换为整数$12345$,恢复时通过$12345/1000$得到原值[^4]。 --- ### 分步实现 #### 1. **数据验证与清洗** - 检查坐标字符串是否合法(含负号、小数点、数字) - 去除非法字符(如非数字符号) ```javascript function cleanCoordinate(str) { // 匹配负号、数字和小数点 const cleaned = str.replace(/[^-\d.]/g, ''); // 避免多个小数点(如"12.34.5"转为"12.345") const parts = cleaned.split('.'); if (parts.length > 2) { return parts[0] + '.' + parts.slice(1).join(''); } return cleaned; } ``` #### 2. **缩放转换(核心步骤)** - 定义缩放因子(如$1000$对应保留3位小数) - 将浮点数转换为整数 ```javascript function scaleToInt(str, factor = 1000) { const num = parseFloat(str); if (isNaN(num)) throw new Error("无效坐标值"); return Math.round(num * factor); // 四舍五入避免截断误差 } ``` #### 3. **还原原始值** - 使用时通过除法恢复原始精度 ```javascript function intToCoordinate(intValue, factor = 1000) { return intValue / factor; } ``` --- ### 完整示例 ```javascript // 示例坐标字符串 const coordStr = "-118.243683°"; // 步骤1: 清洗数据 const cleanedStr = cleanCoordinate(coordStr); // 输出: "-118.243683" // 步骤2: 缩放为整数 const scaledInt = scaleToInt(cleanedStr, 1000); // 输出: -118244 // 步骤3: 还原原始值 const originalValue = intToCoordinate(scaledInt, 1000); // 输出: -118.244 ``` --- ### 关键注意事项 1. **缩放因子选择** - 根据精度需求调整,例如:保留3位小数用$1000$,4位用$10000$ - 需确保整数范围不超过JavaScript的$\pm 2^{53}$限制(一般坐标值不会超出) 2. **负数处理** - 转换时需保留负号,避免符号丢失(引用[^3]中的符号检查逻辑可集成到清洗步骤) 3. **性能优化** - 若处理高频数据,建议使用位运算替代`Math.round()`(但对大数可能失效) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值