有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用加速度计绘制java图形

我已经在Java中使用加速计实现了pin输入方法来解锁安卓智能手机,现在我想通过使用acclerometer绘制图案来更新它。谁能帮帮我,因为我对此一无所知。 提前谢谢


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
         安卓:orientation="vertical"
         安卓:layout_width="fill_parent"
         安卓:layout_height="fill_parent"
         安卓:id="@+id/main_view"
         安卓:background="#ff00ff00">

<Button
    安卓:id="@+id/button1"
    安卓:layout_width="wrap_content"
    安卓:layout_height="wrap_content"
    安卓:layout_alignParentLeft="true"
    安卓:layout_alignParentTop="true"
    安卓:layout_marginLeft="21dp"
    安卓:layout_marginTop="28dp"
    安卓:text="" 
    安卓:background="@drawable/red_button"/>

<Button
    安卓:id="@+id/button4"
    安卓:layout_width="wrap_content"
    安卓:layout_height="wrap_content"
    安卓:layout_alignLeft="@+id/button1"
    安卓:layout_centerVertical="true"
    安卓:text=""
    安卓:background="@drawable/blue_button" />

<Button
    安卓:id="@+id/button6"
    安卓:layout_width="wrap_content"
    安卓:layout_height="wrap_content"
    安卓:layout_alignLeft="@+id/button4"
    安卓:layout_below="@+id/button4"
    安卓:layout_marginLeft="26dp"
    安卓:layout_marginTop="88dp"
    安卓:text="" 
    安卓:background="@drawable/rep_button"/>

<Button
    安卓:id="@+id/button2"
    安卓:layout_width="wrap_content"
    安卓:layout_height="wrap_content"
    安卓:layout_above="@+id/button5"
    安卓:layout_centerHorizontal="true"
    安卓:layout_marginBottom="46dp"
    安卓:background="@drawable/yellow_button" />

<Button
    安卓:id="@+id/button3"
    安卓:layout_width="wrap_content"
    安卓:layout_height="wrap_content"
    安卓:layout_alignBaseline="@+id/button1"
    安卓:layout_alignBottom="@+id/button1"
    安卓:layout_toRightOf="@+id/button2"
    安卓:background="@drawable/black_button" />

<Button
    安卓:id="@+id/button5"
    安卓:layout_width="wrap_content"
    安卓:layout_height="wrap_content"
    安卓:layout_above="@+id/button6"
    安卓:layout_alignLeft="@+id/button7"
    安卓:background="@drawable/pink_button" />

<Button
    安卓:id="@+id/button7"
    安卓:layout_width="wrap_content"
    安卓:layout_height="wrap_content"
    安卓:layout_alignBaseline="@+id/button6"
    安卓:layout_alignBottom="@+id/button6"
    安卓:layout_toRightOf="@+id/button2"
    安卓:background="@drawable/org_button" />

</RelativeLayout>

共 (1) 个答案

  1. # 1 楼答案

    以下是我发现的一些可以帮助您开始的开放源代码:

    以下是主要活动:

    import android.graphics.Point;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import java.util.Timer;
    import java.util.TimerTask;
    import android.app.Activity;
    import android.os.Handler;
    import android.view.Display;
    import android.view.Window;
    import android.view.WindowManager.LayoutParams;
    import android.widget.FrameLayout;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorManager;
    import android.content.Context;
    import android.content.res.Configuration;
    import android.hardware.SensorEventListener;
    import android.widget.Toast;
    
    
    public class TiltBall extends ActionBarActivity {
    
        BallView mBallView = null;
        Handler RedrawHandler = new Handler(); //so redraw occurs in main thread
        Timer mTmr = null;
        TimerTask mTsk = null;
        int mScrWidth, mScrHeight;
        android.graphics.PointF mBallPos, mBallSpd;
    
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            requestWindowFeature(Window.FEATURE_NO_TITLE); //hide title bar
        //set app to full screen and keep screen on
            getWindow().setFlags(0xFFFFFFFF, LayoutParams.FLAG_FULLSCREEN | LayoutParams.FLAG_KEEP_SCREEN_ON);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_tilt_ball);
        //create pointer to main screen
            final FrameLayout mainView = (android.widget.FrameLayout) findViewById(R.id.main_view);
    
         //get screen dimensions
            Display display = getWindowManager().getDefaultDisplay();
            mScrWidth = display.getWidth();
            mScrHeight = display.getHeight();
            mBallPos = new android.graphics.PointF();
            mBallSpd = new android.graphics.PointF();
    
    
    
    
        //create variables for ball position and speed
            mBallPos.x = mScrWidth / 2;
            mBallPos.y = mScrHeight / 5;
            mBallSpd.x = 0;
            mBallSpd.y = 0;
    
            //create initial ball
            mBallView = new BallView(this, mBallPos.x, mBallPos.y, 75);
    
            mainView.addView(mBallView); //add ball to main screen
            mBallView.invalidate(); //call onDraw in BallView
    
        //listener for accelerometer, use anonymous class for simplicity
            ((SensorManager) getSystemService(Context.SENSOR_SERVICE)).registerListener(
                    new SensorEventListener() {
                        @Override
                        public void onSensorChanged(SensorEvent event) {
                            //set ball speed based on phone tilt (ignore Z axis)
                            mBallSpd.x = -event.values[0] * (30/10);
                            mBallSpd.y = event.values[1] * (30/10);
                            //timer event will redraw ball
                        }
    
                        @Override
                        public void onAccuracyChanged(Sensor sensor, int accuracy) {
                        } //ignore
                    },
                    ((SensorManager) getSystemService(Context.SENSOR_SERVICE))
                            .getSensorList(Sensor.TYPE_ACCELEROMETER).get(0),
                    SensorManager.SENSOR_DELAY_NORMAL);
    
            //listener for touch event
            mainView.setOnTouchListener(new android.view.View.OnTouchListener() {
                public boolean onTouch(android.view.View v, android.view.MotionEvent e) {
                    //set ball position based on screen touch
                    mBallPos.x = e.getX();
                    mBallPos.y = e.getY();
                    //timer event will redraw ball
                    return true;
                }
            });
        } //OnCreate
    
        //listener for menu button on phone
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            menu.add("Exit"); //only one menu item
            return super.onCreateOptionsMenu(menu);
        }
    
        //listener for menu item clicked
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle item selection
            if (item.getTitle() == "Exit") //user clicked Exit
                finish(); //will call onPause
            return super.onOptionsItemSelected(item);
        }
    
        //For state flow see http://developer.android.com/reference/android/app/Activity.html
        @Override
        public void onPause() //app moved to background, stop background threads
        {
            mTmr.cancel(); //kill\release timer (our only background thread)
            mTmr = null;
            mTsk = null;
            super.onPause();
        }
    
    
        @Override
        public void onResume() //app moved to foreground (also occurs at app startup)
        {
            //create timer to move ball to new position
            mTmr = new Timer();
            mTsk = new TimerTask() {
                public void run() {
    
                    //if debugging with external device,
    //  a log cat viewer will be needed on the device
                    Log.d("TiltBall", "Timer Hit - " + mBallPos.x + ":" + mBallPos.y);
    
    
    //move ball based on current speed
                    mBallPos.x += mBallSpd.x;
                    mBallPos.y += mBallSpd.y;
    
                    //if ball goes off screen, reposition to opposite side of screen
                    if (mBallPos.x > mScrWidth) mBallPos.x = 0;
                    if (mBallPos.y > mScrHeight) mBallPos.y = 0;
                    if (mBallPos.x < 0) mBallPos.x = mScrWidth;
                    if (mBallPos.y < 0) mBallPos.y = mScrHeight;
    
                    //update ball class instance
                    mBallView.x = mBallPos.x;
                    mBallView.y = mBallPos.y;
    //redraw ball. Must run in background thread to prevent thread lock.
                    RedrawHandler.post(new Runnable() {
                        public void run() {
                            mBallView.invalidate();
                        }
                    });
                }
            }; // TimerTask
    
            mTmr.schedule(mTsk, 10, 10); //start timer
            super.onResume();
        } // onResume
    
    
        @Override
        public void onDestroy() //main thread stopped
        {
            super.onDestroy();
            //wait for threads to exit before clearing app
            System.runFinalizersOnExit(true);
            //remove app from memory
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    
        //listener for config change.
        //This is called when user tilts phone enough to trigger landscape view
        // we want our app to stay in portrait view, so bypass event
        @Override
        public void onConfigurationChanged(Configuration newConfig)
        {
            super.onConfigurationChanged(newConfig);
        }
    
    }
    

    这是BallView课程:

    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.view.View;
    
    public class BallView extends View {
    
        public float x;
        public float y;
        private final int r;
        private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    
    
        //construct new ball object
        public BallView(Context context, float x, float y, int r) {
            super(context);
            //color hex is [transparncy][red][green][blue]
            mPaint.setColor(0xFF1325E0);  //not transparent. color is blue
            this.x = x;
            this.y = y;
            this.r = r;  //radius
        }
    
        //qcalled by invalidate()
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawCircle(x, y, r, mPaint);
        }
    
        public int getRadius(){
            return r;
        }
    }
    

    您可以将框架布局与以下代码结合使用:

      <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:orientation="vertical"
                 android:layout_width="fill_parent"
                 android:layout_height="fill_parent"
                 android:id="@+id/main_view"
                 android:background="#ff000000">
    </FrameLayout>
    

    这将生成一个蓝球,该蓝球将对设备倾斜做出相应的响应。可以通过对球的位置进行采样来添加多边形线机制,并相应地在这些连接点上绘制连接线,从而创建看起来像连续平滑线的多段线