- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Android 应用程序中有一个运行良好的 ListActivity。直到我决定使用加速度计添加滚动功能。
这是我的代码:
package be.pxl.minecraftguide;
import android.app.ListActivity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.ListView;
import be.pxl.minecraftguide.providers.RecipeCategoryProvider;
public class Crafting extends ListActivity implements SensorEventListener {
private SimpleCursorAdapter adapter;
private SensorManager sensorManager;
private Sensor acceleroMeter;
private float[] history = new float[2];
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.categorylist);
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(RecipeCategoryProvider.CONTENT_URI, null, null, null, null);
String[] from = {RecipeCategoryProvider.COL_CATID, RecipeCategoryProvider.COL_CATIMG, RecipeCategoryProvider.COL_CATDESC};
int[] to = { R.id.txtCatID, R.id.imgCatImage, R.id.txtCatDescription };
adapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.categoryrow, cursor, from, to, 0);
/*SimpleCursorAdapter.ViewBinder viewBinder = new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int arg2) {
if(view.getId() == R.id.imgCatImage) {
ImageView image = (ImageView)findViewById(R.id.imgCatImage);
image.setImageResource(R.drawable.ic_launcher);
}
return false;
}
};*/
setListAdapter(adapter);
//__________BRON/ http://stackoverflow.com/questions/18751878/android-using-the-accelerometer-to-create-a-simple-maraca-app_____________
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
acceleroMeter = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, acceleroMeter, 1000000);
/*recipeListView.setOnClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View row,
int position, long id) {
TextView txtId = (TextView)row.findViewById(R.id.txtRecipeID);
int recipeID = Integer.parseInt(txtId.getText().toString());
String description = ((TextView)row.findViewById(R.id.txtRecipeDescription)).getText().toString();
// Launching new Activity on selecting single List Item
// Intent craftingDetailIntent = new Intent(getApplicationContext(), craftingdetail.class);
// sending data to new activity
//craftingDetailIntent.putExtra("Category", item);
//startActivity(craftingDetailIntent);
}
});*/
}
/*@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
int recipeID = Integer.parseInt(v.getTag().toString());
}*/
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
sensorManager.unregisterListener(this); //De accelerometer afzetten
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
sensorManager.registerListener(this, acceleroMeter, SensorManager.SENSOR_DELAY_UI); //De accelerometer opnieuw starten
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float xChange = history[0] - event.values[0];
float yChange = history[1] - event.values[1]; //Verschil tussen nieuwe en oude positie ophalen.
history[0] = event.values[0];
history[1] = event.values[1]; //Nieuwe waarden bewaren voor volgende event trigger
if (xChange > 2){
//Links
}
else if (xChange < -2){
//Rechts
}
if (yChange > 2){
getListView().smoothScrollBy(getListView().getHeight() * adapter.getCount(), 2000);
getListView().postDelayed(new Runnable() {
@Override
public void run() {
getListView().smoothScrollBy(0, 0); //Geanimeerd scrollen naar laatste positie
getListView().setSelection(adapter.getCount() - 1);
}
}, 1000);
}
else if (yChange < -2){
getListView().smoothScrollBy(getListView().getHeight() * adapter.getCount(), 2000);
getListView().postDelayed(new Runnable() {
@Override
public void run() {
getListView().smoothScrollBy(0, 0); //Geanimeerd scrollen naar eerste positie positie
getListView().setSelection(0);
}
}, 1000);
}
}
}
}
问题是,当我向上移动时,列表应该向下滚动并停留在底部。但是我的列表会向下滚动,然后偶尔会向上滚动。向下运动也是如此。
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/minecraft_portrait"
android:transcriptMode="alwaysScroll" >
</ListView>
并不太相关,但这是我的行 xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recipeRow"
android:layout_width="match_parent"
android:layout_height="65sp"
android:background="@drawable/listview_selector" >
<TextView
android:id="@+id/txtCatID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:textColor="@android:color/black" />
<ImageView
android:id="@+id/imgCatImage"
android:layout_width="wrap_content"
android:layout_height="55sp"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:src="@drawable/ic_launcher"
android:contentDescription="@string/recipecategory" />
<TextView
android:id="@+id/txtCatDescription"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/imgCatImage"
android:gravity="center"
android:background="#99FFFFFF"
android:textSize="20sp"
android:textColor="@android:color/black"
android:text="test" />
</RelativeLayout>
我该如何解决这个问题?
最佳答案
我一直在寻找使用传感器滚动 ListActivity 的相同解决方案(在 Google Glass 的上下文中),而另一个答案对我不起作用(滚动不稳定)。
不过,我能够让另一个版本正常工作,仅基于 ListView
(mList
,在下面的示例中)。请注意,这还假设一次屏幕上的项目数量是固定的(因为所有 Glass 显示器的尺寸都相同),但是可以更改此设置以检查屏幕上有多少项目以获得更通用的 Android 解决方案。此解决方案还使用 Sensor.TYPE_ROTATION_VECTOR
,它在支持的设备上进行一些传感器融合,因此输出噪音较小(导致不需要的上下移动较少)。
注册监听器:
mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR),
SensorManager.SENSOR_DELAY_UI);
...这是 onSensorChanged()
方法:
@Override
public void onSensorChanged(SensorEvent event) {
if (mList == null) {
return;
}
if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
SensorManager.getRotationMatrixFromVector(mRotationMatrix, event.values);
// Only uncomment the below two lines if you're running on Google Glass
//SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X,
// SensorManager.AXIS_Z, mRotationMatrix);
SensorManager.getOrientation(mRotationMatrix, mOrientation);
mHeading = (float) Math.toDegrees(mOrientation[0]);
mPitch = (float) Math.toDegrees(mOrientation[1]);
float xDelta = history[0] - mHeading; // Currently unused
float yDelta = history[1] - mPitch;
history[0] = mHeading;
history[1] = mPitch;
float Y_DELTA_THRESHOLD = 0.10f;
//Log.d(TAG, "Y Delta = " + yDelta);
int scrollHeight = mList.getHeight()
/ 19; // 4 items per page, scroll almost 1/5 an item
//Log.d(TAG, "ScrollHeight = " + scrollHeight);
if (yDelta > Y_DELTA_THRESHOLD) {
//Log.d(TAG, "Detected change in pitch up...");
mList.smoothScrollBy(-scrollHeight, 0);
} else if (yDelta < -Y_DELTA_THRESHOLD) {
//Log.d(TAG, "Detected change in pitch down...");
mList.smoothScrollBy(scrollHeight, 0);
}
}
}
其他详细信息在这个答案中: https://stackoverflow.com/a/23298377/937715
有关重新映射传感器坐标系以处理 Android 设备上所有可能的方向变化的代码,请参阅: https://stackoverflow.com/a/22138449/937715
关于Android listactivity 滚动与加速度计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19540828/
大家早上好! 我遇到以下问题:我有传感器加速度计并添加了一个可以帮助我输入另一个 Intent 的按钮,但不知道为什么这个按钮不起作用!有什么建议吗?谢谢帮助!! 程序是这样的: package co
我想使用手机加速计来滚动球中的球。运动有效正确的是,问题在于球撞到墙时。我怎样才能顺利滚动球沿着大球内侧滑动的动画? 这是我当前移动球并检查交点的代码: onSuccess: function
我是 Core Motion 的新手,我很困惑。有人可以用简单的术语解释这些输入衡量的是什么以及它们如何有用吗? 最佳答案 加速度计通过“感觉”施加到设备上的运动力来测量相对于重力的运动。运动力可以描
尝试测量基于距离的加速度(移动加速度计)。如果那是真的 Accelerometer { id: accel dataRate: 1000 / 25 onReadingChang
我需要实现一个震动识别器,我正在使用设备上的加速度计来实现这一点。但是,当我检查从传感器获得的值时,它们似乎因设备而异。例如,我在一台设备上得到 0-8 的值范围作为力(经过一些计算),在另一台设备上
我一直在尝试使用 sensors 实现陀螺仪图像查看器包,然而,结果似乎非常滞后。我在 YouTube 上发现了一个类似的项目它试图实现类似的目标,但正如您在视频中看到的那样,动画也非常滞后。 以下代
我必须找到解决问题的最佳方法,尝试识别 body 运动(口袋里有 iPhone),例如行走、停止、左转/右转、坐下。 我正在考虑只是启发式地查找与每个操作相对应的数据,然后根据该数据(带有阈值)检查传
如何平滑 iPhone/iPod Touch 的加速计? 最佳答案 您可以在使用之前对传入数据应用过滤器来平滑加速度计数据。您要做的第一件事是为您的过滤器设置一个常量。 #define kFilter
我想使用陀螺仪、加速度计和磁力计来获得 3 轴完全平滑的旋转。 第一个问题是我的输出有很大的噪音,我想知道如何消除它。 第二个问题是陀螺仪漂移,我认为应该用卡尔曼滤波器来解决。 第三个问题是加速度计。
我编写了让玩家左右移动的代码,当玩家向左移动时它有一个动画,当他向右移动时它有另一个动画。 这是代码(dt 是 deltaTime): // Moving player desktop
我最近在我的摩托罗拉 Droid 上使用 Android SDK 和适用于 Android SDK 的 Adobe AIR 来研究 Android 加速度计。我注意到加速度计工作得很好,但我想知道
我想创建一个用户在开车时无法打开短信的应用程序(意味着通过检查 android 设备特定速度的加速度计)。在 android 中是否可行,如果是,那么我们如何做到这一点。谢谢。 .尼山贾恩 最佳答案
我正在开发一个 iPhone 应用程序,我们试图在其中计算移动汽车的加速度。类似的应用程序已经完成了这一点(Dynolicious),但不同的是,这个应用程序是为一般城市驾驶而设计的,而不是在拖拉带上
当水平放置在平面上时,我的 Galaxy S4 报告恒定加速度 X:0.2 Y:-0.1 Z:10.4 由于它平稳地水平放置在 table 上,因此期望报告 X:0 Y:0 Z:10.4 通过检查与我
我目前正在开发一个 android 应用程序。我必须用事件时间记录加速度计传感器事件坐标。我得到了像“3497855005850”这样的传感器事件时间戳,但我无法将事件时间戳转换为用户可读的日期时间格
我正在尝试构建一个应用程序,用于从我的手机上读取加速度计的值,该应用程序仅支持 Android 2.1。 如何使用兼容 2.1 的代码从加速度计中读取数据? 最佳答案 从这里开始: public cl
我有两个问题: 1. 是否可以检索 b2Body 的当前 X 坐标?我知道 API GetPosition 但这还不够具体,我需要专门的 X 坐标。 2. 是否可以在我的 UIAcceleromete
Phonegap 加速度计似乎返回如下 y 值: // +10 y axis = straight up = 0/360 deg // -10 y axis = straight down = 180
我一直在使用这个代码 Android: I want to shake it实现摇动运动检测器。但实际上当我在我的智能手机上运行它时,它什么也没做。我尝试使用断点来检查,但它永远不会进入 if (mA
我正在 Android 中开发一个应用程序以及 Android Wear 支持。在查看来自 https://developer.android.com/training/building-wearab
我是一名优秀的程序员,十分优秀!